如何根据条件阻止选择TreeViewItem

时间:2011-02-01 21:14:32

标签: wpf xaml treeview treeviewitem

我有wpf TreeView - 绑定到一些数据。 Treeview位于窗口的左侧,分为两个区域,其中树是导航,右侧的面板根据所选的树节点更改内容。

并非树视图的所有节点都会生成详细信息。 我想禁用这些节点的选择。有什么想法吗?

由于

2 个答案:

答案 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中的HasDetailsIsSelected绑定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>