Шаблон иерархических данных вызывает свойство выбранного элемента - PullRequest
0 голосов
/ 30 ноября 2018

Я создал статический ресурс приложения для моего стиля TreeView.У меня есть пользовательский тип в качестве типа шаблона иерархических данных, давайте назовем его Foobar.Источник HierarchicalDataTemplate items привязан к коллекции 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 голосов
/ 01 декабря 2018

То, что вы можете сделать, это связать свойство IsSelected из 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

<DataTrigger Binding="{Binding IsSelected}" Value="True">
    <DataTrigger.Setters>
        ...
    </DataTrigger.Setters>
</DataTrigger>
...