6

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

我能做到这一点吗?

谢谢...

4

4 回答 4

5

为每种类型的项目定义样式,就像 Bijington 写的那样。对于不可选择的节点,将容器的 Focusable-Property(对于 TreeViews 的 TreeViewItem)设置为 false。

于 2011-01-21T13:06:43.977 回答
2

为此,您需要覆盖树视图的样式。理想情况下,您将拥有两种类型的树视图项目,一种用于您的顶级节点(我假设文件夹),另一种仅用于子节点,那么您应该能够定义树中每个项目类型的行为方式。所以为每个项目类型创建一个样式,然后为文件夹节点简单地更改触发器为被选中不做任何事情。

于 2008-10-30T13:10:06.093 回答
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;
        }
    }
}

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

于 2009-07-27T09:05:24.360 回答
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 也会阻止它们被选中。

于 2018-10-18T08:34:17.147 回答