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

Lam*_*fif 4 .net c# wpf treeview

我有一个WPF应用程序,其中我有一个treeview控件.

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

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

但它没有奏效.这个错误的原因是什么?如何更改我的代码段以完成此任务?

JRO*_*JRO 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);
    }
}
Run Code Online (Sandbox Code Playgroud)


Shi*_*mmy 7

@JROs 的答案在数据绑定到项目时不起作用,只有在直接将TreeViewItems添加到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);
  }
}
Run Code Online (Sandbox Code Playgroud)

用法:

treeView.SetExpansion(isExpanded: true / false);
Run Code Online (Sandbox Code Playgroud)

  • Shimmy 在这里绝对正确 - 如果树是数据绑定的,则项目不是 TreeViewItem 的实例,它们是您绑定到的任何对象的实例,因此需要跳过一些环才能到达可视的 TreeViewItem。 (2认同)