我有wpf TreeView - 绑定到一些数据。 Treeview位于窗口的左侧,分为两个区域,其中树是导航,右侧的面板根据所选的树节点更改内容。
并非树视图的所有节点都会生成详细信息。 我想禁用这些节点的选择。有什么想法吗?
由于
答案 0 :(得分:19)
@ jama64:如果将Style从Property IsEnabled更改为Focusable,您可以实现所需。
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="Focusable" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
答案 1 :(得分:5)
你的源代码中有一个类似布尔属性的东西叫做HasDetails
吗?在这种情况下,你可以使用这样的东西。在ItemContainerStyle中创建一个MultiDataTrigger,它绑定到DataContext中的HasDetails
,IsSelected
绑定TreeViewItem
,如果两者都是True(嗯,HasDetails是假的真:-),你开始一个故事板“取消选择”新选择的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>
更新
要禁用HasDetails为False的TreeViewItem
,您可以使用此
<TreeView ...>
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsEnabled" Value="{Binding HasDetails}"/>
</Style>
</TreeView.ItemContainerStyle>
</TreeView>