分层数据模板触发所选项目属性

时间:2018-11-30 14:33:56

标签: wpf triggers treeview hierarchicaldatatemplate application-resource

我已经为我的TreeView样式创建了一个静态应用程序资源。我有一个自定义类型作为分层数据模板类型,我们称之为Foobar。 HierarchicalDataTemplate项源绑定到Foobar的FooCollection。

自定义对象绑定不是问题。问题是我想使用触发器更改所选TreeViewItem的样式。属性IsMouseOver的触发器应触发。但是我找不到在IsSelected中触发属性HierarchicalDataTemplate.Triggers的地方吗?

<Style TargetType="TreeView" x:Key="TreeView">
    <Setter Property="BorderBrush" Value="{x:Null}"/>
    <Setter Property="Background" Value="#00000000"/>

    <Style.Resources>

        <!--Foobar tree view items-->
        <HierarchicalDataTemplate DataType="{x:Type f:Foobar}" ItemsSource="{Binding FooCollection}">

            <TextBlock Name="tbbName" Text="{Binding Name}" Foreground="#7FFFFFFF" FontSize="16"/>

            <HierarchicalDataTemplate.Triggers>

                <Trigger Property="IsMouseOver" Value="True">
                    <Setter TargetName="tbbName" Property="Effect">
                        <Setter.Value>
                            <DropShadowEffect ShadowDepth="0" Color="#7FFFFFFF" Opacity="1" BlurRadius="20"/>
                        </Setter.Value>
                    </Setter>
                    <Setter TargetName="tbbName" Property="Foreground" Value="#AFFFFFFF"/>
                </Trigger>

            </HierarchicalDataTemplate.Triggers>
        </HierarchicalDataTemplate>
    </Style.Resources>
</Style>

1 个答案:

答案 0 :(得分:0)

您可以做的是将IsSelected的{​​{1}}属性绑定到TreeViewItem中的相应属性

Foobar
class Foobar : INotifyPropertyChanged
{
    ...
    private bool _isSelected;
    public bool IsSelected
    {
        get => _isSelected;
        set
        {
            if(_isSelected == value)
                return;
            _isSelected = value;
            OnPropertyChanged();
        }
    }
    ...
}

然后您可以使用<TreeView> <TreeView.ItemContainerStyle> <Style TargetType="{x:Type TreeViewItem}"> <Setter Property="IsSelected" Value="{Binding IsSelected}" /> ... </Style> </TreeView.ItemContainerStyle> ... </TreeView>

DataTrigger