我正在尝试根据附加到TreeViewItems的属性(布尔值)更改TreeView中TreeViewItems的背景。我试过这个:
<local:BooleanToBrushConverter x:Key="BooleanToBrushConverter"
TrueBrush="Yellow" FalseBrush="Transparent"/>
<local:TreeViewEx ItemsSource="{Binding Items}">
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True"/>
<Setter Property="Background" Value="{Binding Path=(local:TreeViewItemExtensions.Selected),
RelativeSource={RelativeSource Self},
Converter={StaticResource BooleanToBrushConverter}}"/>
<TreeView.Resources>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent"/>
<SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Green"/>
</TreeView.Resources>
...
</local:TreeViewEx>
跑了应用程序,但是虽然我(编程)在“Child”TreeViewItem上将属性(Selected,不要与IsSelected混淆)设置为true,但背景未设置
我看过Snoop并发现它没有应有的黄色背景(转换器触发并正确返回):
但是,看一下Snoop,它会显示黄色画笔已应用到该TreeViewItem:
但是,如果我手动将背景设置为父Stackpanel(Snoop中的[016]),则它会反映该值。但我无法通过这种风格来实现它。
有什么想法吗?
UPDATE :似乎当前所选的项目有某种需要以某种方式解决的风格..
答案 0 :(得分:2)
问题是由TreeView.ItemContainerStyle only applies to the root item引起的。如果您使用TreeView.Resources中TreeViewItem的默认样式替换TreeView.ItemContainerStyle,您将获得适用于所有项目的样式(在该TreeView中):
<TreeView>
<TreeView.Resources>
<!-- default style instead of ItemContainerStyle -->
<Style TargetType="TreeViewItem">
<Setter Property="Background"
Value="{Binding Path=(local:TreeViewItemExtensions.Selected),
RelativeSource={RelativeSource Self},
Converter={StaticResource BooleanToBrushConverter}}"/>
</Style>
</TreeView.Resources>
<TreeViewItem Header="Root" IsExpanded="True">
<TreeViewItem Header="Child"/>
<TreeViewItem Header="Child" Name="testChild"/>
<TreeViewItem Header="Child"/>
</TreeViewItem>
</TreeView>
现在设置Selected附加属性:
TreeViewItemExtensions.SetSelected(testChild, true);