在 WPF 资源字典中使用 Blend d:Style.DataContext 是否有效?



定义 WPF 样式时,我经常使用 Expression Blend<d:Style.DataContext>标记来让智能感知知道运行时 DataContext 是什么。 效果很好。 不幸的是,我似乎无法在资源词典中完成这项工作,我不清楚为什么。

例如,在RadTabItem的样式中,我告诉IntellisenseSettingsPageVm将是DataContext:

<UserControl x:Class="Views.ConfigureView"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
xmlns:viewModels="clr-namespace:ViewModels"
d:DataContext="{d:DesignInstance viewModels:ConfigureVm}">
<Grid>
<tk:RadTabControl ItemsSource="{Binding Categories}" >  
<tk:RadTabControl.Resources>
<!-- Tell setters that SettingsPageVm will be the datacontext -->
<Style TargetType="{x:Type tk:RadTabItem}">
<d:Style.DataContext>
<x:Type Type="viewModels:SettingsPageVm" />
</d:Style.DataContext>
<!-- (Imagine many setters here, binding to SettingsPageVm) -->

这工作正常。

但是,如果尝试,我将相同的样式移动到单独的ResourceDictionary Visual Studio抱怨。 编辑在d:Style.DataContext声明下方放置一个蓝色波浪线,并将其突出显示为红色。 编译器对此抱怨如下:

1>I:\Dev\MyApp\Resources\Styles\DialogStyles.xaml(13,14(: error MC4004:样式不能包含子"类型扩展"。风格儿童必须 成为二传手,因为它被添加到二传手集合中。13号线 位置 14。

为什么这在一种情况下有效,而在另一种情况下无效?

<ResourceDictionary 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:viewModels="clr-namespace:ViewModels"
xmlns:tk="http://schemas.telerik.com/2008/xaml/presentation"
>
<Style x:Key="SettingsPageTabStyle"  TargetType="{x:Type tk:RadTabItem}">
<d:Style.DataContext>                           <!-- *** ERROR *** -->
<x:Type Type="viewModels:SettingsPageVm" />
</d:Style.DataContext>
</Style>
</ResourceDictionary>

回答我自己的问题,因为半天后我偶然发现了它。

我忽略了添加

mc:Ignorable="d" 

行到我的 XAML。 一旦我这样做了,一切都很好。

(这只是那些晦涩难懂的 WPF 课程之一,我确信我已经学过了,然后在过去几年的 WPF 工作中至少忘记了一次 - 也许两次。 )

最新更新