Wpf 如何防止基于条件选择TreeView项目

Wpf 如何防止基于条件选择TreeView项目,wpf,xaml,treeview,treeviewitem,Wpf,Xaml,Treeview,Treeviewitem,我有wpf树视图-绑定到一些数据。 Treeview位于窗口的左侧,分为两个区域,其中树是导航,右侧的面板根据所选的树节点更改内容 并非treeview的所有节点都生成详细信息。 我想禁用这些节点的选择。有什么想法吗 谢谢您的源代码中是否有类似布尔属性的内容,称为HasDetails或其他内容?在这种情况下,你可以使用这样的东西。在ItemContainerStyle中创建一个MultiDataTrigger,该触发器绑定到DataContext中的HasDetails,并为TreeViewIt

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

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


谢谢

您的源代码中是否有类似布尔属性的内容,称为HasDetails或其他内容?在这种情况下,你可以使用这样的东西。在ItemContainerStyle中创建一个MultiDataTrigger,该触发器绑定到DataContext中的HasDetails,并为TreeViewItem选择,如果两者都为True,则为True,则HasDetails为False:-,则启动一个故事板,取消选择新选择的TreeViewItem

这将禁用对所有没有详细信息但仍可扩展的TreeView项目的选择。希望这就是你想要的

<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>

@jama64:如果将样式从Property IsEnabled更改为Focusable,则可以实现您想要的效果

<TreeView.ItemContainerStyle>
     <Style TargetType="{x:Type TreeViewItem}">
         <Setter Property="Focusable" Value="{Binding HasDetails}"/>
     </Style>
</TreeView.ItemContainerStyle>

谢谢你,梅莱克。它工作得非常好,但是我丢失了最后一个节点的选择突出显示。有什么想法吗?@jama64:你的意思是你可以选择它,但它不会突出显示“更改颜色”?在这种情况下,我无法复制它不,它不会按要求选择,但整个树将丢失选择突出显示。例如,如果一个可选择的节点处于活动状态,而我们尝试选择一个不可选择的节点,则不可选择的节点将不会被选择,但树将丢失选择突出显示。@jama64:没有详细信息的节点是否必须可展开?否则,您可以使用IsEnabled。将TreeView重置为最后一个选定的项目需要一些代码,但我可以发布,如果您愿意,是的,没有细节的节点需要展开和折叠。它们包含具有详细信息的节点。为什么不在选择这些节点时显示“无可用详细信息”这样的消息?使它们不可选择与树视图的功能不太一致。如果用户单击某个节点,但该节点未被选中,则他的第一个想法是,单击已丢失,并且没有对其操作的视觉反馈。更不用说更容易实现。
<TreeView.ItemContainerStyle>
     <Style TargetType="{x:Type TreeViewItem}">
         <Setter Property="Focusable" Value="{Binding HasDetails}"/>
     </Style>
</TreeView.ItemContainerStyle>