定义 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 工作中至少忘记了一次 - 也许两次。 )