【问题标题】:Can I control which nodes are selectable in a WPF TreeView?我可以控制在 WPF TreeView 中可以选择哪些节点吗?
【发布时间】:2008-10-30 03:18:02
【问题描述】:

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

我能做到吗?

谢谢...

【问题讨论】:

    标签: wpf treeview


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 但是如何防止树视图从语义上选择顶级节点?隐藏使用视觉样式选择类别的事实可能还不够
      【解决方案3】:

      我已经在附加属性中写道,一旦它被选中就会取消选择树视图项:

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

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

      【讨论】:

        【解决方案4】:

        您可以通过在样式中使用触发器来仅选择子节点,假设所有子节点都没有子节点,如下所示:

        <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 也会阻止它们被选中。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-04-22
          • 2011-07-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-02-09
          • 1970-01-01
          相关资源
          最近更新 更多