【发布时间】:2016-10-11 16:51:36
【问题描述】:
我有一个充满不同类型项目的 TreeView。这些项目可以是Node 类型(那么他们可能有孩子)或Entry 类型(那么他们没有孩子)。为此,我将我的 TreeView 绑定到我的 ViewModel 属性AllNodesAndEntries,这是一个ObservableCollection<object>。对于Node 和Entry 的不同外观,我定义了两个DataTemplate。代码如下:
<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 元素无法聚焦。
所以我在 Entry 的 DataTemplate 中添加了一个触发器,如下所示:
<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 后选择条目。 我做错了什么?如何让它发挥作用?
我确实在MyProp 的setter 中放置了NotifyPropertyChanged(nameof(MyProp));,因此对MyProp 的更改将报告给视图。
【问题讨论】: