根据附加属性更改TreeViewItem背景

时间:2012-01-22 10:22:36

标签: wpf background treeview styles treeviewitem

我正在尝试根据附加到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并发现它没有应有的黄色背景(转换器触发并正确返回):

enter image description here

但是,看一下Snoop,它会显示黄色画笔已应用到该TreeViewItem:

enter image description here

但是,如果我手动将背景设置为父Stackpanel(Snoop中的[016]),则它会反映该值。但我无法通过这种风格来实现它。

有什么想法吗?


UPDATE :似乎当前所选的项目有某种需要以某种方式解决的风格..

1 个答案:

答案 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);