在窗口上设置时间DataContext给编译器错误?

我在下面的WPF应用程序的主窗口下面的XAML,我想设置下面的devise时间d:DataContext ,我可以成功地为我所有的用户控件,但它给了我这个错误,当我尝试做它在窗户上…

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> 

我需要将mc:Ignorable="d"属性添加到Window标签。 本质上,我学到了一些新东西。 Expression Blend / Visual Studiodevise器确认的d:名称空间前缀实际上真正的编译器/ xamlparsing器忽略/“注释掉了

 <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 Locations 1799-1811)。 萨姆斯。 Kindle版。

标记兼容性

标记兼容性XML名称空间( http://schemas.openxmlformats.org/markup-compatibility/2006 ,通常与mc前缀一起使用)包含一个Ignorable属性,指示XAML处理器忽略指定名称空间中的所有元素/属性(如果它们可以“不要parsing为他们的.NETtypes/成员。 (该命名空间还具有一个ProcessContent属性,用于覆盖被忽略的命名空间内的特定types的Ignible。)

Expression Blend利用此function来执行诸如将devise时属性添加到可在运行时忽略的XAML内容的function。

mc:Ignorable给定一个空格分隔的名字空间列表,而mc:ProcessContent可以给出一个以空格分隔的元素列表。 当XamlXmlReader遇到无法parsing的可忽略内容时,它不报告任何节点。 如果可以解决可以忽略的内容,则会正常报告。 所以消费者不需要做任何特别的事情来正确地处理标记兼容性。

哇,真是太痛苦了! 我们希望MS提供一些VSdevise时支持x:Bind。

我们能够使用VSdevise器,但也能够轻松切换到x:绑定而不是绑定。 以下是我所做的:

  • 在我的视图中,我添加了一个属性来获取我的ViewModel。 这是有道理的,因为x:绑定path是相对于页面(即视图对象)。

  • 在我的Page XAML中,我将以下内容添加到XAML顶部的<Page ... >中:

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

这样,由于{x:Bind} ,页面的实际数据上下文被设置为页面本身。 这是因为x:Bind是相对于页面,并没有给出的path。

同时,由于d:DataContext行,VSdevise师反映了MyView类(不创build实例),以便VSdevise器交互。 这可以让VS从MyViewdevise,在那里你可以向下滚动到ViewModel属性,展开它并select你想绑定的项目。

当你这样做的时候,VSdevise器将创build一个绑定语句,其path与视图相关,即恰好与x:Bind所期望的path相同。 所以,如果你想切换到x:绑定以后,你可以search和replace所有“ {Binding ”与“ {x:Bind ”。

为什么我们甚至需要d:DataContext行来告诉VS要看什么类? 好问题,因为你会认为VS可以找出下一行设置DataContext到页面,使用DataContext={x:Bind} 。 继续尝试吧,它不起作用,如果你改变x:绑定到相对于自我的绑定,它也不会工作。

希望这种情况将得到MS清理!