2009-09-28 33 views
32

Có cách nào để tự động mở rộng tất cả các nút từ treeview trong WPF không? Tôi đã tìm kiếm và thậm chí không tìm thấy chức năng mở rộng trong thuộc tính treeview.AutoExpand treeview trong WPF

Cảm ơn

+0

Quên đề cập đến Tôi không có TreeviewItem, nhưng các loại mục khác nhau trong cây của tôi. –

Trả lời

57

Bạn có thể đặt ItemContainerStyle và sử dụng thuộc tính IsExpanded.

<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 
    <Grid> 
     <TreeView> 
     <TreeView.ItemContainerStyle> 
      <Style TargetType="{x:Type TreeViewItem}"> 
       <Setter Property="IsExpanded" Value="True"/> 
      </Style> 
     </TreeView.ItemContainerStyle> 
     <TreeViewItem Header="Header 1"> 
      <TreeViewItem Header="Sub Item 1"/> 
     </TreeViewItem> 
     <TreeViewItem Header="Header 2"> 
      <TreeViewItem Header="Sub Item 2"/> 
     </TreeViewItem> 
     </TreeView> 
    </Grid> 
</Page> 

Nếu bạn cần thực hiện điều này từ mã, bạn có thể viết viewmodel cho các mục chế độ xem dạng cây của mình và liên kết Thuộc tính được giải phóng tương ứng với mô hình. Để biết thêm ví dụ tham khảo bài viết tuyệt vời từ Josh Smith trên CodeProject: Câu trả lời Simplifying the WPF TreeView by Using the ViewModel Pattern

3

Đây là những gì tôi sử dụng:

private void ExpandAllNodes(TreeViewItem rootItem) 
{ 
    foreach (object item in rootItem.Items) 
    { 
     TreeViewItem treeItem = (TreeViewItem)item; 

     if (treeItem != null) 
     { 
      ExpandAllNodes(treeItem); 
      treeItem.IsExpanded = true; 
     } 
    } 
} 

Để cho nó để làm việc bạn phải gọi phương pháp này trong một vòng lặp foreach cho nút gốc:

// this loop expands all nodes 
foreach (object item in myTreeView.Items) 
{ 
    TreeViewItem treeItem = (TreeViewItem)item; 

    if (treeItem != null) 
    { 
     ExpandAllNodes(treeItem); 
     treeItem.IsExpanded = true; 
    } 
} 
+1

Hi Carlo. Điều này sẽ không hoạt động nếu bạn có một cái gì đó khác với TreeViewItem trong bộ sưu tập Items của bạn. Nếu bạn muốn chắc chắn cách tiếp cận này hoạt động trong mọi trường hợp, bạn nên sử dụng ItemContainerGenerator từ đối tượng TreeView của bạn và gọi nó là phương thức ContainerFromItem(). – Anvaka

+0

Bạn nói đúng, cách tôi thêm các mục vào treeview của tôi là myTree.Items.Add (new TreeViewItem() {Header = myObject}) ;, Đó là lý do tại sao nó hoạt động cho tôi. Xin lỗi vì đã gây hiểu lầm. – Carlo

+0

Bạn có thể đơn giản hóa mã để được myTreeView.Items.OfType () và bạn sẽ không phải kiểm tra null hoặc trường hợp các mục. – jwize

1

Carlo là tốt hơn bởi vì nó sẽ mở ra tất cả các cấp

này cải thiện khi mà ví dụ với một chút ngắn gọn hơn ví dụ mã.

private void ExpandAllNodes(TreeViewItem treeItem) 
    { 
     treeItem.IsExpanded = true; 
     foreach (var childItem in treeItem.Items.OfType<TreeViewItem>()) 
     { 
       ExpandAllNodes(childItem); 
     } 
    } 

Gọi nó bằng cách sử dụng dòng mã này

TreeViewInstance.Items.OfType<TreeViewItem>().ToList().ForEach(ExpandAllNodes); 
+0

'foreach (TreeViewItem childItem trong TreeItem.Items)' ngắn hơn foreach của bạn nhưng hoạt động tốt. :) – Shakaron

+0

Điều này sẽ không hoạt động khi sử dụng MVVM vì các mục sẽ không là 'TreeViewItem'. Xem bình luận của Anvaka về câu trả lời của Carlo. – MickyD

2

nếu bạn muốn mở rộng bằng tay bạn có thể thử

XAML:

<TreeView x:Name="TreePeople"> 
    <TreeView.ItemContainerStyle> 
     <Style TargetType="{x:Type TreeViewItem}"> 
      <Setter Property="IsExpanded" Value="True" /> 
     </Style> 
    </TreeView.ItemContainerStyle> 
</TreeView> 

C#:

bool Expanded = false; 
// The event subscription method (for a button click) 
private void ButtonExpand__Click(object sender, RoutedEventArgs e) 
{ 
    Expanded = !Expanded; 
    Style Style = new Style 
    { 
     TargetType = typeof(TreeViewItem) 
    }; 

    Style.Setters.Add(new Setter(TreeViewItem.IsExpandedProperty, Expanded)); 
    TreePeople.ItemContainerStyle = Style; 
} 
Các vấn đề liên quan