WPF TreeViewItem切换按钮可见性

时间:2011-10-26 16:38:08

标签: c# wpf wpf-controls

我遇到了一个问题我希望有人可以帮我解决。我遇到了一个案例,我的节点包含一组可见性设置为false的子节点。我希望我可以禁用TreeViewItem旁边的切换箭头,如果它的所有子项都是不可见的。这可能吗?这是一个例子:

<TreeView Margin="10,10,0,13" Name="TreeView1" HorizontalAlignment="Left" VerticalAlignment="Top" Width="194" Height="200">
    <TreeViewItem Header="Cold Drinks">
        <TreeViewItem Header="Coke" Visibility="False"></TreeViewItem>
        <TreeViewItem Header="Pepsi" Visibility="False"></TreeViewItem>
    </TreeViewItem>
</TreeView>

我如何让Cold Drinks TreeViewItem隐藏切换箭头?

2 个答案:

答案 0 :(得分:2)

如果您看到TreeViewItem的deafult controlTemplate,您将看到Toggle按钮的可见性绑定到ItemsControl.HasItems。触发器看起来像这样 -

<Trigger Property="ItemsControl.HasItems">
  <Setter TargetName="Expander" Property="UIElement.Visibility" Value="{x:Static Visibility.Hidden}" />
     <Trigger.Value>
        <s:Boolean>False</s:Boolean>
     </Trigger.Value>
</Trigger>

因此,作为一种变通方法,您可以创建自己的自定义控件派生自TabItem并将您的HasItems绑定到您自己的CLR属性,该属性将循环遍历您的所有childItems(TreeViewItems),如果任何Item可见或将返回True如果所有项目都处于隐藏/折叠状态,则返回false。这样,您的切换按钮将根据Trigger自动隐藏。

如果你想知道如何创建自定义控件并将其绑定到你的CLR属性,你可以参考这个 -

WPF TreeView databinding to hide/show expand/collapse icon

这与您一直在寻找的有些相同。希望这会有所帮助..

答案 1 :(得分:0)

内部(即键盘导航)和默认模板 TreeViewItem 依赖于 HasItems 属性来了解它是否有子节点。您可能需要将TreeViewItem的ItemsSource设置为列表并过滤掉折叠的项目。