具有多选的 WPF TreeView

标签 wpf treeview multi-select

就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the help center寻求指导。




9年前关闭。




标准 WPF tree view不支持多选。

如何向我的 WPF 应用程序添加支持多选的 TreeView ?商业产品很好(我目前知道一种商业实现 - http://www.telerik.com/products/wpf/treeview.aspx)

最佳答案

下面的代码工作正常,而且更简单。然而,缺点是 TreeView 类的非公共(public)属性 IsSelectionChangeActive 的使用。下面的代码:

private static readonly PropertyInfo IsSelectionChangeActiveProperty 
  = typeof (TreeView).GetProperty
    (
      "IsSelectionChangeActive",
      BindingFlags.NonPublic | BindingFlags.Instance
    );

public static void AllowMultiSelection(TreeView treeView)
{
  if (IsSelectionChangeActiveProperty==null) return;

  var selectedItems = new List<TreeViewItem>();
  treeView.SelectedItemChanged += (a, b) =>
  {
    var treeViewItem = treeView.SelectedItem as TreeViewItem;
    if (treeViewItem == null) return;

    // allow multiple selection
    // when control key is pressed
    if (Keyboard.IsKeyDown(Key.LeftCtrl) || Keyboard.IsKeyDown(Key.RightCtrl))
    {
      // suppress selection change notification
      // select all selected items
      // then restore selection change notifications
      var isSelectionChangeActive = 
        IsSelectionChangeActiveProperty.GetValue(treeView, null);

      IsSelectionChangeActiveProperty.SetValue(treeView, true, null);
      selectedItems.ForEach(item => item.IsSelected = true);

      IsSelectionChangeActiveProperty.SetValue
      (
        treeView, 
        isSelectionChangeActive, 
        null
      );
    }
    else
    {
      // deselect all selected items except the current one
      selectedItems.ForEach(item => item.IsSelected = (item == treeViewItem) );
      selectedItems.Clear();
    }

    if (!selectedItems.Contains(treeViewItem))
    {
      selectedItems.Add(treeViewItem);
    }
    else
    {
      // deselect if already selected
      treeViewItem.IsSelected = false;
      selectedItems.Remove(treeViewItem);
    }
  };

}

关于具有多选的 WPF TreeView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1163801/

相关文章:

c# - DataTable 到可观察集合

Android GridView 多选

wpf - 通过拖动启用 ListView 多选

c# - 组合框 Tabstop 获得双焦点

c# - WPF 控件的公共(public)类修饰符

c# - 以编程方式触发 UI 事件以进行单元测试

c# - WPF TreeView 中的 "Link"项

jquery - 在nestedSortable jQuery UI 插件中进行多选?

c# - 这个单向绑定(bind)会泄漏内存吗?

C# Winforms bold treeview 节点不显示整个文本