在Window上设置设计时间DataContext会导致编译器错误?


203

我在WPF应用程序的主窗口下面有以下XAML,我试图在d:DataContext下面设置设计时间,我可以为所有各种UserControl成功地进行设计,但是当我在窗口...

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>

Answers:


263

我需要将mc:Ignorable="d"属性添加到Window标记。本质上,我学到了一些新东西。真正的编译器/ xaml解析器d:实际上会忽略/“注释掉” Expression Blend / Visual Studio设计人员认可的名称空间前缀!

<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遇到无法解决的可忽略内容时,它不会报告任何节点。如果可解决的内容可以解决,则将正常报告。因此,消费者不需要执行任何特殊操作即可正确处理标记兼容性。


12
我已经为此花了很长时间。有意义,但似乎是一个巨大的疏忽(应该在没有所有这些黑客的情况下支持设计时数据对象)
基本

3
如果你想,而不是作为属性利用在它自己的节点忽略的数据上下文<d:Window.DataContext />
ChéDon

很棒的技巧,帮助我努力解决了一个奇怪的编译器异常。如果没有mc:ignorable,即使我设置了d:DataContext,XAML编译器也将其解释为试图设置DataContext,并抱怨使用了错误的xmlns名称空间。
Tore Aurstad

19

哇,好痛!让我们希望MS为x:Bind提供一些VS设计时支持。

我们不仅可以使用VS设计器,而且还可以轻松切换到x:Bind而不是Binding。这是我所做的:

  • 在我的视图中,我添加了一个属性以获取我的ViewModel。这是有道理的,因为x:Bind路径是相对于Page(即View对象)的。

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

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

这样,由于导致Page的实际数据上下文设置为Page本身{x:Bind}。这是因为x:Bind相对于Page,并且没有给出路径。

同时,由于该d:DataContext行,VS设计器出于VS设计器交互的目的,在MyView类上进行了反思(不创建实例)。这使VS从MyView进行设计,然后可以在其中向下滚动到ViewModel属性,将其展开并选择要绑定到的项目。

完成所有这些操作后,VS设计器将创建一个Binding语句,其路径是相对于View的,即它恰好与x:Bind期望的路径相同。因此,如果以后要切换到x:Bind,则只需搜索并用“ {Binding” 替换所有“ {x:Bind”。

为什么我们甚至需要d:DataContext一行来告诉VS要看什么课?很好的问题,因为您认为VS可以找出下一行,使用将DataContext设置为Page DataContext={x:Bind}。继续尝试,如果您将x:Bind更改为相对于self的Binding,则它将不起作用,也将不起作用。

希望这种情况将被MS清除!


3
WPF不支持x:Bind; 此答案不适用于OP。
Byrel Mitchell '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.