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

时间:2011-11-28 23:20:20

标签: wpf

我的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>

3 个答案:

答案 0 :(得分:255)

我需要将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"
...
/>

以下摘自

Nathan, Adam (2010-06-04). WPF 4 Unleashed (Kindle Locations 1799-1811). Sams. Kindle Edition.

标记兼容性

标记兼容性XML命名空间(http://schemas.openxmlformats.org/markup-compatibility/2006,通常与mc前缀一起使用)包含一个Ignorable属性,指示XAML处理器如果无法解析,则忽略指定命名空间中的所有元素/属性他们的.NET类型/成员。 (命名空间还有一个ProcessContent属性,该属性覆盖忽略的命名空间内的特定类型的Ignorable。)

Expression Blend利用此功能执行诸如将设计时属性添加到可在运行时忽略的XAML内容之类的操作。

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

答案 1 :(得分:17)

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

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

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

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

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

这样,由于{x:Bind},Page的实际数据上下文被设置为Page本身。那是因为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={x:Bind}将DataContext设置为Page。继续尝试它,它不起作用,如果你改变x:它绑定到相对于自我的绑定也不起作用。

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

答案 2 :(得分:0)

如果您对数据不太挑剔,请查看 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>

然后用几行数据呈现项目控件