在Window上设置设计时DataContext会产生编译错误吗?

Jon*_*son 201 wpf

我在WPF应用程序的主窗口下面有以下XAML,我正在尝试设置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>
Run Code Online (Sandbox Code Playgroud)

Jon*_*son 261

我需要将mc:Ignorable="d"属性添加到Window标记.基本上我学到了新东西.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"
...
/>
Run Code Online (Sandbox Code Playgroud)

以下内容取自

内森,亚当(2010-06-04).WPF 4 Unleashed(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认同)
  • 如果您想在自己的节点中使用可忽略的数据上下文而不是属性,请使用<d:Window.DataContext /> (3认同)

小智 17

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

我们能够使用VS设计器,但也能够轻松切换到x:Bind而不是Binding.这是我做的:

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

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

    mc:Ignorable="d" 
    d:DataContext="{d:DesignInstance Type=local:MyView, IsDesignTimeCreatable=False}" 
    DataContext="{x:Bind}"
    
    Run Code Online (Sandbox Code Playgroud)

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

同时,由于该d:DataContext行,VS设计器在VS设计器交互的目的上反映了MyView类(没有创建实例).这样就可以从MyView进行VS设计,然后可以向下滚动到ViewModel属性,展开它并选择要绑定到的项目.

当您完成所有这些操作时,VS设计器将创建一个Binding语句,其路径相对于View,即它恰好与x:Bind期望的路径完全相同.因此,如果您想切换到x:稍后绑定,您只需搜索并用" {Binding" 替换所有" {x:Bind".

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

希望这种情况会被MS清理干净!!

  • WPF不支持x:Bind; 此答案不适用于OP。 (3认同)