我有一个填充了不同类型的项目的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>