HierarchicalDataTemplate中Style中的DataTrigger不起作用 - TreeView

时间:2016-06-02 15:03:33

标签: wpf xaml treeview datatrigger hierarchicaldatatemplate

我有一个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属性的值;当这是真的时,背景保持不变 我已经尝试将Style移动到HierarchicalDataTemplate.Resources,但这没有任何区别 我在俯视什么? 谢谢 -

1 个答案:

答案 0 :(得分:1)

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

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

否则,您可以将样式移到模板的资源字典中,将样式放在相关模板的范围内:

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