我在我的WPF应用程序的主窗口中有下面的XAML,我试图设置下面的设计时间d:DataContext,我可以成功地为我所有的各种UserControls做,但当我试图在窗口上做这件事时,它给了我这个错误…
错误1属性“DataContext”必须在默认名称空间或元素名称空间“http://schemas.microsoft.com/winfx/2006/xaml/presentation”中。8号线9号位置。C: \开发\ bplus \ PMT UI \ src \ \主窗口。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>
我需要添加mc:Ignorable="d"属性到Window标签。基本上我学到了一些新东西。Expression Blend/Visual Studio设计器承认的d:名称空间前缀实际上被真正的编译器/xaml解析器忽略/“注释掉”!
<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释放(Kindle位置1799-1811)。地空导弹。Kindle版。
标记的兼容性
标记兼容性XML名称空间(http://schemas.openxmlformats.org/markup-compatibility/2006,通常与mc前缀一起使用)包含一个Ignorable属性,该属性指示XAML处理器忽略指定名称空间中的所有元素/属性,如果它们不能解析为. net类型/成员。(命名空间还有一个ProcessContent属性,用于覆盖被忽略的命名空间内特定类型的Ignorable。)
Expression Blend利用这个特性来做一些事情,比如向XAML内容添加在运行时可以忽略的设计时属性。
mc:Ignorable可以提供一个以空格分隔的名称空间列表,mc:ProcessContent可以提供一个以空格分隔的元素列表。当XamlXmlReader遇到无法解析的可忽略内容时,它不会报告任何节点。可忽略的内容若能被解析,将正常上报。因此消费者不需要做任何特殊的事情来正确处理标记兼容性。
哇,好疼啊!希望MS在x:Bind中加入一些VS设计时支持。
我们希望能够使用VS设计器,但也能够轻松切换到x:Bind而不是Binding。以下是我所做的:
在我的视图中,我添加了一个属性来获取我的ViewModel。这是有意义的,因为x:绑定路径是相对于页面(即视图对象)。
在我的Page XAML中,我将以下内容添加到<Page…在XAML顶部的>:
主持人:可忽略的= " d "
d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}"
DataContext = " {x:绑定}"
这样,由于{x:Bind}, Page的实际数据上下文被设置为Page本身。这是因为x:Bind是相对于Page的,没有给出路径。
同时,由于d:DataContext行,VS设计器为了VS设计器交互的目的反射MyView类(不创建实例)。这让VS从MyView设计,在那里你可以向下滚动到ViewModel属性,展开它并选择你想要绑定的项目。
当你做了所有这些,VS设计器将创建一个绑定语句,它的路径是相对于视图的,也就是说,它恰好与x:Bind所期望的路径完全相同。所以,如果你以后想切换到x:Bind,你可以搜索并将所有“{Binding”替换为“{x:Bind”。
为什么我们甚至需要d:DataContext行来告诉VS要查看什么类?问得好,因为你会认为VS可以用DataContext={x:Bind}找出下一行将DataContext设置为Page。继续尝试吧,它不工作,也不工作,如果你改变x:Bind到Binding相对于self。
希望这种情况能被微软解决!!