禁用TreeView中某些条目的可聚焦性

Kja*_*ara 5 c# wpf treeview triggers

我有一个TreeView,里面装满了不同类型的项目。这些项目可以是类型Node(当时他们可能有孩子)或类型Entry(当时他们没有孩子)。为此,我将TreeView绑定到ViewModel属性AllNodesAndEntries,该属性是一个ObservableCollection<object>。对于不同的长相NodeEntry我定义了两个的DataTemplates。这是代码:

<TreeView ItemsSource="{Binding AllNodesAndEntries}">
    <TreeView.Resources>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}"
                                  DataType="{x:Type local:Node}">
            <TextBlock Text="{Binding Name}"
                       Background="LightBlue"/>
        </HierarchicalDataTemplate>
        <DataTemplate DataType="{x:Type local:Entry}">
            <TextBlock Text="{Binding Name}"
                       Background="LightSalmon"/>
        </DataTemplate>
    </TreeView.Resources>
</TreeView>
Run Code Online (Sandbox Code Playgroud)

现在,如果要Entry满足特定条件(即,如果我的ViewModel属性MyProptrue),我想使元素无法定位。

因此,我将触发器添加到DataTemplate中,Entry如下所示:

        <DataTemplate DataType="{x:Type local:Entry}">
            <TextBlock Text="{Binding Name}"
                       Background="LightSalmon"/>
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding MyProp}" Value="True">
                    <Setter Property="Focusable" Value="False"/>
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
Run Code Online (Sandbox Code Playgroud)

但这是行不通的,MyProp设置为后,我仍然可以选择条目true我究竟做错了什么?我该如何运作?

我确实NotifyPropertyChanged(nameof(MyProp));在中设置了MyProp,所以对的更改MyProp将报告给View。

Fun*_*unk 5

使用IsNodeConverter发布的,您可以实现MultiDataTrigger仅在满足两个条件时才触发的:

  • ViewModel MyProp=真
  • 类型的TreeViewItem Entry

XAML

<Window.Resources>
    <local:IsNodeConverter x:Key="IsNodeConverter"/>
</Window.Resources>

...

    <TreeView ItemsSource="{Binding AllNodesAndEntries}">
        <TreeView.Resources>

            ...

        </TreeView.Resources>
        <TreeView.ItemContainerStyle>
            <Style TargetType="{x:Type TreeViewItem}">
                <Style.Triggers>
                    <MultiDataTrigger>
                        <MultiDataTrigger.Conditions>
                            <Condition  Binding="{Binding DataContext.MyProp, RelativeSource={RelativeSource AncestorType={x:Type Window}}}"
                                        Value="True"/>
                            <Condition  Binding="{Binding Converter={StaticResource IsNodeConverter}}"
                                        Value="False"/>
                        </MultiDataTrigger.Conditions>
                        <MultiDataTrigger.Setters>
                            <Setter Property="Focusable" Value="False"></Setter>
                        </MultiDataTrigger.Setters>
                    </MultiDataTrigger>
                </Style.Triggers>
            </Style>
        </TreeView.ItemContainerStyle>
    </TreeView>
Run Code Online (Sandbox Code Playgroud)