การตั้งค่าเวลาออกแบบ DataContext บนหน้าต่างกำลังให้คอมไพเลอร์ผิดพลาดหรือไม่?


203

ฉันมี XAML ด้านล่างนี้สำหรับหน้าต่างหลักในแอปพลิเคชัน WPF ของฉันฉันพยายามกำหนดเวลาการออกแบบd:DataContextด้านล่างซึ่งฉันสามารถทำกับ UserControls ที่หลากหลายได้ทั้งหมด แต่มันทำให้ฉันเกิดข้อผิดพลาดนี้เมื่อฉันพยายามทำมันบน หน้าต่าง...

Error 1 The property 'DataContext' must be in the default namespace or in the element namespace 'http://schemas.microsoft.com/winfx/2006/xaml/presentation'. Line 8 Position 9. C:\dev\bplus\PMT\src\UI\MainWindow.xaml 8 9 UI

<Window x:Class="BenchmarkPlus.PMT.UI.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:UI="clr-namespace:BenchmarkPlus.PMT.UI"
    xmlns:Controls="clr-namespace:BenchmarkPlus.PMT.UI.Controls"
    d:DataContext="{d:DesignInstance Type=UI:MainViewModel, IsDesignTimeCreatable=True}"
    Title="MainWindow" Height="1000" Width="1600" Background="#FF7A7C82">

    <Grid>
        <!-- Content Here -->
    </grid>

</Window>

คำตอบ:


263

ฉันต้องการเพิ่มแอmc:Ignorable="d"ททริบิวให้กับแท็กหน้าต่าง โดยพื้นฐานแล้วฉันได้เรียนรู้สิ่งใหม่ d:คำนำหน้า namespace ที่ Expression Blend / ภาพสตูดิโอออกแบบยอมรับว่าเป็นจริงละเว้น / "ออกความเห็น"โดยคอมไพเลอร์จริง / XAML parser!

<Window 
...
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>

ต่อไปนี้ถูกนำมาจาก

นาธานอดัม (2010-06-04) WPF 4 Unleashed (จุดติดตั้ง 1799-1811) Sams จุด Edition.

ความเข้ากันได้กับมาร์กอัป

มาร์กอัพ XML ที่เข้ากันได้ของมาร์กอัพ ( http://schemas.openxmlformats.org/markup-compatibility/2006ซึ่งมักใช้กับmcคำนำหน้า) มีแอตทริบิวต์ Ignorable ที่สั่งให้โปรเซสเซอร์ XAML ละเว้นองค์ประกอบ / คุณลักษณะทั้งหมดในเนมสเปซที่ระบุหากไม่สามารถทำได้ ได้รับการแก้ไขให้กับ. NET ประเภท / สมาชิก (เนมสเปซยังมีแอตทริบิวต์ ProcessContent ที่แทนที่ Ignorable สำหรับประเภทเฉพาะภายในเนมสเปซที่ถูกละเว้น)

Expression Blend ใช้ประโยชน์จากคุณสมบัตินี้เพื่อทำสิ่งต่าง ๆ เช่นเพิ่มคุณสมบัติเวลาออกแบบให้กับเนื้อหา XAML ที่สามารถละเว้นได้ในขณะใช้งานจริง

mc:Ignorableสามารถกำหนดรายการเนมสเปซที่คั่นด้วยเว้นวรรคและ mc: ProcessContent สามารถกำหนดรายการองค์ประกอบที่คั่นด้วยช่องว่างได้ เมื่อ XamlXmlReader พบเนื้อหาที่ไม่สามารถแก้ไขได้ซึ่งไม่สามารถแก้ไขได้มันจะไม่รายงานโหนดใด ๆ หากเนื้อหาที่เพิกเฉยสามารถแก้ไขได้ก็จะรายงานตามปกติ ดังนั้นผู้บริโภคไม่จำเป็นต้องทำอะไรเป็นพิเศษเพื่อจัดการกับความเข้ากันได้ของมาร์กอัปอย่างถูกต้อง


12
ฉันตีหัวของฉันกับสิ่งนี้มาระยะหนึ่งแล้ว ดูสมเหตุสมผล แต่ดูเหมือนว่าจะมีการดูแลอย่างมาก (ควรสนับสนุนวัตถุข้อมูลขณะออกแบบโดยไม่มีแฮ็กเหล่านี้ทั้งหมด)
พื้นฐาน

3
ถ้าคุณต้องการบริบทข้อมูลที่เพิกเฉยในโหนดของตัวเองแทนเป็นแอตทริบิวต์ใช้ <d: Window.DataContext />
ChéDon

เคล็ดลับที่ดีช่วยฉันในการดิ้นรนโดยมีข้อยกเว้นของผู้แปล mc: ไม่สามารถเพิกเฉยได้แม้ว่าฉันจะตั้งค่า d: DataContext คอมไพเลอร์ XAML ตีความว่าเป็นการพยายามตั้งค่า DataContext และบ่นเกี่ยวกับการใช้เนมสเปซ xmlns ผิด
Tore Aurstad

19

ว้าวช่างเจ็บปวดเหลือเกิน! หวังว่า MS จะให้การสนับสนุนในขณะออกแบบ VS สำหรับ x: Bind

เราสามารถใช้นักออกแบบ VS แต่ยังสามารถสลับเป็น x: Bind ได้อย่างง่ายดายแทนที่จะเป็น Binding นี่คือสิ่งที่ฉันทำ:

  • ในมุมมองของฉันฉันเพิ่มคุณสมบัติเพื่อรับ ViewModel ของฉัน สิ่งนี้สมเหตุสมผลเนื่องจาก x: พา ธ การเชื่อมโยงสัมพันธ์กับเพจ (เช่นวัตถุมุมมอง)

  • ในหน้า XAML ของฉันฉันเพิ่มสิ่งต่อไปนี้<Page ... >ที่ด้านบนของ XAML:

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"

{x:Bind}วิธีนี้บริบทข้อมูลจริงของหน้าถูกตั้งค่าเป็นหน้าตัวเองเนื่องจากการ นั่นเป็นเพราะx:Bindสัมพันธ์กับหน้าและไม่มีเส้นทางที่กำหนด

ในเวลาเดียวกันเนื่องจากd:DataContextสายผู้ออกแบบ VS สะท้อนให้เห็นถึงระดับ MyView (โดยไม่ต้องสร้างอินสแตนซ์) เพื่อวัตถุประสงค์ในการโต้ตอบกับผู้ออกแบบ VS สิ่งนี้ช่วยให้การออกแบบ VS จาก MyView ซึ่งคุณสามารถเลื่อนลงไปที่คุณสมบัติ ViewModel ขยายและเลือกรายการที่คุณต้องการผูก

เมื่อคุณทำทุกอย่างตัวออกแบบ VS จะสร้างคำสั่งการผูกซึ่งมีเส้นทางสัมพันธ์กับมุมมองนั่นคือมันเกิดขึ้นเหมือนกับเส้นทางที่ x: ผูกไว้ ดังนั้นหากคุณต้องการเปลี่ยนเป็น x: ผูกไว้ในภายหลังคุณสามารถค้นหาและแทนที่ " {Binding" ด้วย " {x:Bind" ทั้งหมดได้

ทำไมเราถึงต้องมีd:DataContextบรรทัดเพื่อบอก VS ว่าควรจะเรียนอะไร เป็นคำถามที่ดีเนื่องจากคุณจะคิดว่า VS สามารถคิดออกบรรทัดถัดไปมากชุด DataContext DataContext={x:Bind}ไปที่หน้าโดยใช้ ไปข้างหน้าและลองใช้มันใช้งานไม่ได้และใช้งานไม่ได้หากคุณเปลี่ยน x: ผูกเป็นผูกเข้ากับตัวเอง

หวังว่าสถานการณ์นี้จะได้รับการทำความสะอาดโดย MS !!


3
WPF ไม่รองรับ x: Bind; คำตอบนี้จะไม่ทำงานสำหรับ OP
Byrel Mitchell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.