【问题标题】:DataTrigger in Style in HierarchicalDataTemplate not working -- TreeViewHierarchicalDataTemplate 中样式中的 DataTrigger 不起作用 -- TreeView
【发布时间】:2026-01-19 02:05:02
【问题描述】:

我有一个 DataTrigger 可以根据绑定属性设置 TextBox 的背景。
这是 xaml 的简化版本:

<TreeView  >
<TreeViewItem Header="Things" >
    <TreeViewItem.Resources>
        <Style TargetType="{x:Type TextBlock}">
            <Style.Triggers>
                <DataTrigger Binding="{Binding IsDirty}" Value="True">
                    <Setter Property="Background" Value="LightGray" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
        <HierarchicalDataTemplate DataType="{x:Type local:Type1}" ItemsSource="{Binding Children, Mode=OneWay}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="{Binding Name}" Margin="6,0,6,0" />
                <TextBlock Text="{Binding IsDirty}" Margin="6,0,6,0" />
                <i:Interaction.Behaviors>
                    <dragDrop:FrameworkElementDropBehavior DragEffect="Move"  />
                </i:Interaction.Behaviors>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeViewItem.Resources>
</TreeViewItem>

我添加了一个 TextBlock 来显示 IsDirty 属性的值;如果是这样,背景将保持不变。
我已尝试将样式移至 HierarchicalDataTemplate.Resources,但这没有任何区别。
我忽略了什么?
谢谢——

【问题讨论】:

    标签: wpf xaml treeview datatrigger hierarchicaldatatemplate


    【解决方案1】:

    这是因为隐式样式针对不是从 Control 派生的类型不跨越模板边界,即不会在模板内应用,除非它们是在该模板的范围内定义的。 Here's a good post 解释它是如何工作的以及为什么会这样工作。

    为了跨越模板边界,您应该使用派生自Control 的类型(例如Label)而不是TextBlock,并定义针对该类型的隐式样式。

    否则,您可以通过将样式移动到模板的资源字典中来将您的样式置于相关模板的范围内:

    <HierarchicalDataTemplate (...)>
        <HierarchicalDataTemplate.Resources>
            <Style TargetType="{x:Type TextBlock}">
                (...)
            </Style>
        </HierarchicalDataTemplate.Resources>
        (...)
    </HierarchicalDataTemplate>
    

    【讨论】:

    • 谢谢!我以为我已经尝试将 Style 放在 HDT.Resources 中,但我一定把它们放在了其他地方......也是有用的链接。