2013-12-10 16 views
1

我有一个WPF应用程序,其中我有一个树视图控件。CollapseWPF应用程序中的treeview的所有项目

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

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

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

回答

3

我认为要做到这一点的最好办法是通过所有节点循环和1

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

@JROs塌陷他们1 answer将无法​​正常工作时,数据绑定到项目,它只会在直接将TreeViewItem s加入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);