我有一个绑定了数据的WPF TreeView。
TreeView位于窗口左侧,窗口被分为两个区域,其中树是导航,右侧面板根据选定的节点更改内容。
并非所有树节点都会产生详细信息。我想禁用那些节点的选择。有什么想法吗?
谢谢
并非所有树节点都会产生详细信息。我想禁用那些节点的选择。有什么想法吗?
谢谢
@jama64:如果你将样式从“IsEnabled”更改为“Focusable”,就可以实现你想要的效果。
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Focusable" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
HasDetails
或类似的内容?如果是这样,你可以使用以下方法。在ItemContainerStyle中创建一个MultiDataTrigger,将其绑定到DataContext中的HasDetails
和TreeViewItem
的IsSelected
,如果两者都为True(当HasDetails为False时为True:-),则开始一个Storyboard来“取消选择”新选择的TreeViewItem
。
这将禁用所有没有详细信息的TreeViewItem
的选择,但它们仍然可以展开。希望这正是你想要的。
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Style.Triggers>
<MultiDataTrigger>
<MultiDataTrigger.Conditions>
<Condition Binding="{Binding HasDetails}" Value="False"/>
<Condition Binding="{Binding RelativeSource={RelativeSource Self}, Path=IsSelected}" Value="True"/>
</MultiDataTrigger.Conditions>
<MultiDataTrigger.EnterActions>
<BeginStoryboard>
<Storyboard>
<BooleanAnimationUsingKeyFrames BeginTime="00:00:00"
Storyboard.TargetProperty="(TreeViewItem.IsSelected)">
<DiscreteBooleanKeyFrame KeyTime="00:00:00" Value="False"/>
</BooleanAnimationUsingKeyFrames>
</Storyboard>
</BeginStoryboard>
</MultiDataTrigger.EnterActions>
</MultiDataTrigger>
</Style.Triggers>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>
更新
如果要禁用TreeViewItem
中的HasDetails为False的部分,可以使用以下代码:
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsEnabled" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>