HierarchicalDataTemplate 中样式的 DataTrigger 不起作用——TreeView
DataTrigger in Style in HierarchicalDataTemplate not working -- TreeView
我有一个 DataTrigger 可以根据绑定设置文本框的背景 属性。
这是 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,但这没有任何区别。
我忽略了什么?
谢谢 --
这是因为针对不是从 Control
派生的类型的隐式样式不会 跨越模板边界 ,即不会在模板内部应用,除非它们是在该模板的范围。 Here's a good post 解释它是如何工作的以及为什么这样工作。
为了跨越模板边界,您应该使用从 Control
派生的类型(例如 Label
)而不是 TextBlock
并定义针对该类型的隐式样式。
否则,您可以将您的样式移动到模板的资源字典中,从而将其置于相关模板的范围内:
<HierarchicalDataTemplate (...)>
<HierarchicalDataTemplate.Resources>
<Style TargetType="{x:Type TextBlock}">
(...)
</Style>
</HierarchicalDataTemplate.Resources>
(...)
</HierarchicalDataTemplate>
我有一个 DataTrigger 可以根据绑定设置文本框的背景 属性。
这是 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,但这没有任何区别。
我忽略了什么?
谢谢 --
这是因为针对不是从 Control
派生的类型的隐式样式不会 跨越模板边界 ,即不会在模板内部应用,除非它们是在该模板的范围。 Here's a good post 解释它是如何工作的以及为什么这样工作。
为了跨越模板边界,您应该使用从 Control
派生的类型(例如 Label
)而不是 TextBlock
并定义针对该类型的隐式样式。
否则,您可以将您的样式移动到模板的资源字典中,从而将其置于相关模板的范围内:
<HierarchicalDataTemplate (...)>
<HierarchicalDataTemplate.Resources>
<Style TargetType="{x:Type TextBlock}">
(...)
</Style>
</HierarchicalDataTemplate.Resources>
(...)
</HierarchicalDataTemplate>