折叠Wpf应用程序中的树视图的所有项目

时间:2013-12-10 12:36:20

标签: c# .net wpf treeview

我有一个WPF应用程序,我有一个树视图控件。

我想通过点击按钮来折叠所有项目。我试过这个:

 private void buttonParam_Click(object sender, RoutedEventArgs e)
        {
//handling
    this.arborescence.IsExpanded = false;
        }

但它没有奏效。这个错误的原因是什么?如何更改我的代码段才能执行此任务?

2 个答案:

答案 0 :(得分:8)

我认为最好的方法是循环遍历所有节点并逐个折叠它们。

private void cmdCollapse_Click(object sender, RoutedEventArgs e)
{
    foreach (TreeViewItem item in treeview.Items)
        CollpaseTreeviewItems(item);
}

void CollapseTreeviewItems(TreeViewItem Item)
{
    Item.IsExpanded = false;

    foreach (TreeViewItem item in Item.Items)
    {
        item.IsExpanded = false;

        if (item.HasItems)
            CollapseTreeviewItems(item);
    }
}

答案 1 :(得分:1)

@JROs answer在数据绑定到商品时无效,只有在TreeViewItem直接添加TreeView时才会生效。

我做了这个扩展方法,它将为迭代中的当前对象检索匹配的TreeViewItem

namespace System.Windows.Controls
{
  using System.Linq;
  public static class TreeViewExtensions
  {
    public static void SetExpansion(this TreeView treeView, bool isExpanded) =>
      SetExpansion((ItemsControl)treeView, isExpanded);

    static void SetExpansion(ItemsControl parent, bool isExpanded)
    {
      if (parent is TreeViewItem tvi)
        tvi.IsExpanded = isExpanded;

      if (parent.HasItems)
        foreach (var item in parent.Items.Cast<object>()
      .Select(i => GetTreeViewItem(parent, i, isExpanded)))
          SetExpansion(item, isExpanded);
    }

    static TreeViewItem GetTreeViewItem(
      ItemsControl parent, object item, bool isExpanded)
    {
      if (item is TreeViewItem tvi)
        return tvi;

      var result = ContainerFromItem(parent, item);
      if (result == null && isExpanded)
      {
        parent.UpdateLayout();
        result = ContainerFromItem(parent, item);
      }
      return result;
    }

    static TreeViewItem ContainerFromItem(ItemsControl parent, object item) =>
      (TreeViewItem)parent.ItemContainerGenerator.ContainerFromItem(item);
  }
}

用法:

treeView.SetExpansion(isExpanded: true / false);