Kja*_*ara 5 c# wpf treeview triggers
我有一个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>
Run Code Online (Sandbox Code Playgroud)
现在,如果要Entry满足特定条件(即,如果我的ViewModel属性MyProp为true),我想使元素无法定位。
因此,我将触发器添加到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。
使用IsNodeConverter您发布的,您可以实现MultiDataTrigger仅在满足两个条件时才触发的:
MyProp=真EntryXAML
<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)