我可以控制哪些节点可以在WPF TreeView中被选择吗?

7

我在WPF TreeView中显示了一个两级层次结构,但我只想让子节点可选 - 基本上顶级节点用于分类,但它们本身不应该是可选的。

我能实现这个吗?

谢谢...

4个回答

5

为每种类型的项目定义样式,就像Bijington所写的那样。对于不可选择的节点,将容器(例如TreeView中的TreeViewItem)的Focusable属性设置为false。


2
为了实现这一点,您需要覆盖treeview的样式。理想情况下,您将拥有两种类型的树视图项,一种用于顶级节点(我假设是文件夹),另一种只用于子节点,然后您应该能够定义树中每个项目类型的行为方式。 因此,为每个项目类型创建一个样式,然后对于文件夹节点,仅更改所选的触发器以不执行任何操作即可。

1
但是你如何防止TreeView语义上选择顶级节点?仅通过视觉样式隐藏类别被选中的事实可能不足够。 - Rob Fonseca-Ensor

1

如果假设所有子节点都没有子节点,您可以使用样式中的触发器仅使子节点可选择,例如:

<TreeView Name="MyTreeView>
    <TreeView.ItemContainerStyle>
         <Style TargetType="{x:Type TreeViewItem}">
             <Style.Triggers>
                 <Trigger Property="HasItems" Value="true">
                     <Setter Property="Focusable" Value="False" />
                 </Trigger>
             </Style.Triggers>
          </Style>
     </TreeView.ItemContainerStyle>
</TreeView>

将父TreeViewItems的Focusable属性设置为false也会防止它们被选中。

0
我编写了一个附加属性,当TreeViewItem被选中时会自动取消选择:
public class TreeViewItemHelper
{
    public static bool GetIsSelectable(TreeViewItem obj)
    {
        return (bool)obj.GetValue(IsSelectableProperty);
    }

    public static void SetIsSelectable(TreeViewItem obj, bool value)
    {
        obj.SetValue(IsSelectableProperty, value);
    }

    public static readonly DependencyProperty IsSelectableProperty =
        DependencyProperty.RegisterAttached("IsSelectable", typeof(bool), typeof(TreeViewItemHelper), new UIPropertyMetadata(true, IsSelectablePropertyChangedCallback));

    private static void IsSelectablePropertyChangedCallback(DependencyObject o, DependencyPropertyChangedEventArgs args)
    {
        TreeViewItem i = (TreeViewItem) o;
        i.Selected -= OnSelected;
        if(!GetIsSelectable(i))
        {
            i.Selected += OnSelected;
        }
    }

    private static void OnSelected(object sender, RoutedEventArgs args)
    {
        if(sender==args.Source)
        {
            TreeViewItem i = (TreeViewItem)sender;
            i.IsSelected = false;
        }
    }
}

很遗憾,当您单击一个无法选择的项目时,仍会丢失旧选择 :(


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接