我有下面的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:devbplusPMTsrcUIMainWindow.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"
属性到窗口标签。基本上我学到了一些新东西。d:
命名空间前缀,Expression Blend/Visual Studio设计器承认实际上是忽略/"注释掉"由真正的编译器/xaml解析器!
<Window
...
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
...
/>
以下内容摘自
Nathan, Adam(2010-06-04)。WPF 4 Unleashed (Kindle Locations 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遇到无法解析的可忽略内容时,它不会为其报告任何节点。如果可以解析可忽略的内容,则会正常报告。因此,消费者不需要做任何特殊的事情来正确处理标记兼容性。
哇,好痛苦啊!让我们希望微软在VS设计时为x:Bind提供一些支持。
我们希望能够使用VS设计器,但也能够轻松地切换到x:Bind而不是Binding。我是这样做的:
-
在我的视图中,我添加了一个属性来获取我的ViewModel。这是有意义的,因为x:Bind路径是相对于Page(即View对象)的。
-
在我的页面XAML中,我添加了以下内容到XAML顶部的
<Page ... >
:mc:Ignorable="d" d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" DataContext="{x:Bind}"
{x:Bind}
, Page的实际数据上下文被设置为Page本身。这是因为x:Bind
是相对于页面的,没有给出路径。同时,由于d:DataContext
行,为了VS设计器交互的目的,VS设计器反映在MyView类上(不创建实例)。这允许VS从MyView进行设计,然后你可以向下滚动到ViewModel属性,展开它并选择你想要绑定的项目。
当你做了所有这些,VS设计器将创建一个绑定语句,它的路径是相对于视图的,也就是说,它恰好与x:Bind期望的路径完全相同。所以,如果你稍后想切换到x:Bind,你可以搜索并将所有的"{Binding
"替换为"{x:Bind
"。
为什么我们甚至需要d:DataContext
行来告诉VS要看什么类?好问题,因为你会认为VS可以弄清楚下一行设置数据上下文到页面,使用DataContext={x:Bind}
。继续尝试一下,它不起作用,如果将x:Bind改为相对于self的Binding,它也不起作用。
如果您对数据不太挑剔,可以查看xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
中的示例数据。你可以这样使用…
<ItemsControl ItemsSource="{Binding Path=Report.Audit.Data}" d:ItemsSource="{d:SampleData}" Grid.Row="1">
<ItemsControl.ItemTemplate>
<DataTemplate>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
然后呈现带有几行数据的items控件
我已经解决了在组件定义(UserControl或Window)中添加d:DataContext="{d:SampleData}"
的问题。
<UserControl x:Class="TestControl"
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:local="clr-namespace:TestApp.Views"
DataContext="{Binding TestViewModel}"
mc:Ignorable="d"
d:DesignHeight="450" d:DesignWidth="800"
d:DataContext="{d:SampleData}"
>