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

我有一个填充了不同类型的项目的TreeView.这些项可以是Node类型(然后它们可能有子项)或类型为Entry(那么它们没有子项).为此,我将TreeView绑定到我的ViewModel属性AllNodesAndEntries,它是一个ObservableCollection< object>.对于Node和Entry的不同外观,我定义了两个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>

现在,如果满足某个条件(即,如果我的ViewModel属性MyProp为true),我想让Entry元素不可聚焦.

所以我在DataTemplate for 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>

但它不起作用,我仍然可以在MyProp设置为true后选择条目.我究竟做错了什么?我如何使其工作?

我确实放了一个NotifyPropertyChanged(nameof(MyProp));在MyProp的setter中,对MyProp的更改将报告给View.

解决方法:

使用IsNodeConverter你是posted,
你可以实现一个只在满足两个条件时触发的MultiDataTrigger:

> ViewModel MyProp = true
> Entry类型的TreeViewItem

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>
上一篇:MySQL Trigger仅适用于某个mysql用户


下一篇:我可以通过SQL Server触发器调用C#函数吗?