【问题标题】:How to change TreeViewItem background color according to property of bound data?如何根据绑定数据的属性更改 TreeViewItem 背景颜色?
【发布时间】:2013-08-04 04:00:48
【问题描述】:

我有一个 TreeView,其中数据绑定到我的数据层次结构上的通用派生包装类。 我的绑定包装类包括添加的字段,例如“IsHilighted”和“IsExpanded”。

我想根据其绑定的数据属性“IsHiglighted”更改任何 TreeViewItem 的背景。我想将 Hilighted item 的颜色设置为与默认 Selected item 背景颜色相同(或更浅)的颜色。

理想情况下,我不想修改现有的 XAML...我的意思是最终能够通过代码添加行为。

更新

我找到了部分解决方案:我必须添加如下定义的触发器。代码如下。

        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>

            <Style.Triggers>
                <DataTrigger Binding="{Binding Path=IsHilighted}" Value="true">
                    <Setter Property="Background" Value="SlateBlue"></Setter>
                    <Setter Property="Opacity" Value="160"></Setter>
                </DataTrigger>
            </Style.Triggers>
        </Style>

仍未解决:如何将 Hilighted 项目的颜色(参见上面的部分解决方案)绑定到“选定”TreeViewItem 背景颜色,即在部分解决方案上替换“SlateBlue”以绑定到现有所选项目样式背景颜色?

原始 TreeView XAML 代码:

<TreeView Name="TreeViewSelectScopeStudy" MinHeight="24" Margin="7" ItemsSource="{Binding Path=TvItemRootPssTreeViewRoot.ChildsView}" Height="Auto"
    VerticalAlignment="Stretch"
    VirtualizingStackPanel.IsVirtualizing="True"
    VirtualizingStackPanel.VirtualizationMode="Recycling">

    <TreeView.Resources>

        <Style TargetType="TreeViewItem">
            <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>
        </Style>


        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" />

        <HierarchicalDataTemplate DataType="{x:Type scopeSelection:WrapperSimulatedInfoStudy}" ItemsSource="{Binding Path=Childs}">
            <StackPanel Orientation="Horizontal">
                <CheckBox IsChecked="{Binding Path=IsSelected}"></CheckBox>
                <TextBlock Text="{Binding Path=TvItemName}" Margin="5,0,0,0"></TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>

        <HierarchicalDataTemplate DataType="{x:Type scopeSelection:WrapperSimulatedInfoSimulation}">
            <StackPanel Orientation="Horizontal" ToolTip="{Binding Path=Item.InvalidityReason}">
                <StackPanel.Style>
                    <Style TargetType="{x:Type StackPanel}">
                        <Style.Triggers>
                            <DataTrigger Binding="{Binding Path=Item.IsValid}" Value="false">
                                <Setter Property="Opacity" Value="160"></Setter>
                            </DataTrigger>
                        </Style.Triggers>
                    </Style>
                </StackPanel.Style>
                <CheckBox IsChecked="{Binding Path=IsSelected}" IsEnabled="{Binding Path=Item.IsValid}" ToolTip="{Binding Path=Item.InvalidityReason}"></CheckBox>
                <CheckBox IsChecked="{Binding Path=IsHilighted}"></CheckBox>
                <TextBlock Text="{Binding Path=TvItemName}" Margin="5,0,0,0" ToolTip="{Binding Path=Item.InvalidityReason}">
                    <TextBlock.Style>
                        <Style TargetType="{x:Type TextBlock}">
                            <Style.Triggers>
                                <DataTrigger Binding="{Binding Path=Item.IsValid}" Value="false">
                                    <Setter Property="Background" Value="LightPink"></Setter>
                                </DataTrigger>
                            </Style.Triggers>
                        </Style>
                    </TextBlock.Style>
                </TextBlock>
            </StackPanel>
        </HierarchicalDataTemplate>
    </TreeView.Resources>
</TreeView>

【问题讨论】:

    标签: wpf templates styles treeview treeviewitem


    【解决方案1】:

    您可以再定义一个名为IsItemSelected 的属性并将其绑定到TreeViewItems IsSelected 属性(类似于您对IsExpanded 所做的操作)。

    <Style TargetType="TreeViewItem">
        <Setter Property="IsExpanded" Value="{Binding Path=IsExpanded}"/>
        <Setter Property="IsSelected" Value="{Binding Path=IsItemSelected}"/>
    </Style>
    

    然后您可以为IsItemSelected 属性定义一个DataTrigger 并设置背景颜色。

    <DataTrigger Binding="{Binding Path=IsItemSelected}" Value="true">
        <Setter Property="Background" Value="Blue"></Setter>
    </DataTrigger>
    

    【讨论】:

    • 谢谢阿南德。我同意它应该可以正常工作。但是我最大的问题是找到绑定到“选定项目样式”的现有颜色的方法。我想知道是否必须根据 TreeViewItemStyle 的“选定样式”或其他方式定义新样式?以及如何去做。我目前正在尝试通过代码来完成,但我遇到了一些困难。
    猜你喜欢
    • 2012-12-07
    • 1970-01-01
    • 2020-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多