是否可以为样式指定数据上下文的类型

本文关键字:数据 上下文 类型 样式 是否 | 更新日期: 2023-09-27 18:25:40

我正在开发一个WPF应用程序,该应用程序使用样式和模板动态构建功能区菜单,下面是相关的片段:

<RibbonTab x:Name="HomeTab" Header="Home" HorizontalAlignment="Stretch" ItemContainerStyle="{StaticResource GroupStyle}" ItemsSource="{Binding Groups}"/>
<Style TargetType="RibbonGroup" x:Key="GroupStyle">
    <Setter Property="Header" Value="{Binding Header}" />
    <Setter Property="ItemsSource" Value="{Binding Controls}"/>
    <Setter Property="ItemTemplate" Value="{StaticResource RibbonButtonTemplate}"/>
</Style>
<DataTemplate x:Key="RibbonButtonTemplate" DataType="{x:Type enums:RibbonControlConfig}">
    <RibbonButton Label="{Binding Header}" LargeImageSource="{Binding Image}" Command="{Binding Command}"/>
</DataTemplate>

因此,现在Resharper抱怨GroupStyle中的绑定,因为它们实际上是视图模型的子属性的元素,正如RibbonTab上的ItemSource绑定所示。

当然,这功能很好,我只是希望ReSharper没有任何抱怨,也希望能够获得准确的Intellisense,所以有没有办法告诉风格它的上下文是什么?

附带说明:我第一次尝试使用嵌套的数据模板来进行此设置,但我没能让任何东西通过一级模板来工作。

是否可以为样式指定数据上下文的类型

否,不能在样式中指定DataContext类型。通常,无论如何都不应该在样式中使用绑定,因为样式是关于外观的,而不是关于数据的。如果您计划使控件可重复使用,则遵循此规则尤为重要:您不能对它将绑定到什么进行假设。

当然,您可以指定要应用样式的视图的DataContext的类型。这对于享受类型安全、自动完成和编写没有ReSharper警告的XAML是必要的。

据我所知,有两种方法,用于指定样式中DataContext的类型;坏的方式和好的方式。

糟糕的方式:

<Style TargetType="{x:Type MyView}" d:DataContext="{d:DesignInstance MyViewModel}">
    ...

这看起来还可以,而且最初看起来是有效的,但这是一个非常糟糕的主意,因为如果你使用它,XAML热重载功能将开始无声地失败,而不会给你任何关于它失败原因的提示。有关更多信息,请参阅我博客上的这篇文章:michael.gr-WPF 中XAML热重新加载的问题

好方法:

<Style TargetType="{x:Type MyView}">
    <d:Style.DataContext>
        <x:Type Type="MyViewModel" />
    </d:Style.DataContext>
    ...

这个很管用。