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

问题描述 投票:0回答:1

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

例如,这里以RadTabItem的样式,我告诉Intellisense SettingsPageVm将是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):错误MC4004:样式不能包含子项“ TypeExtension”。风格孩子必须是Setter,因为它已添加到Setters集合中。 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>
wpf xaml resourcedictionary
1个回答
0
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.