我可以控制WPF TreeView中可选择的节点吗?

时间:2008-10-30 03:18:02

标签: wpf treeview

我在WPF TreeView中显示了一个两级层次结构,但我只希望子节点可以选择 - 基本上顶层节点用于分类但不应该自己选择。

我可以实现吗?

...谢谢

4 个答案:

答案 0 :(得分:5)

为每种类型的物品定义样式,比如Bijington写道。对于不可选节点,将容器的Focusable-Property(TreeViews的TreeViewItem)设置为false。

答案 1 :(得分:2)

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

答案 2 :(得分:0)

我写了附属物,它会在选择后立即取消选择树形图:

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

不幸的是,当您点击一个不可选的项目时,您仍会丢失旧的选择:(

答案 3 :(得分:0)

假设所有子节点都没有子节点,则可以通过样式中的触发器使子节点只能选择,如下所示:

<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还会阻止选择它们。