2009-09-28 6 views
32

Есть ли способ автоматически развернуть все узлы из дерева в WPF? Я искал и даже не нашел функцию расширения в свойстве treeview.AutoExpand treeview в WPF

Благодаря

+0

Забытый упоминание У меня нет TreeviewItem, но разные предметы в моем дереве. –

ответ

57

You может установить ItemContainerStyle и использовать свойство 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> 

Если вам нужно сделать это из кода, вы можете написать ViewModel для просмотра дерева элементов, и привязать IsExpanded свойство к соответствующему одному из модели. Дополнительные примеры относятся к большой статье от Джоша Смита CodeProject: ответ Simplifying the WPF TreeView by Using the ViewModel Pattern

3

Это то, что я использую:

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

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

Для того, чтобы работать вы должны вызвать этот метод в цикле Еогеасп для корневого узла:

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

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

Привет Карло. Это не сработает, если у вас есть что-то отличное от TreeViewItem в вашей коллекции Items. Если вы хотите убедиться, что этот подход работает в любом случае, вы должны использовать ItemContainerGenerator из объекта TreeView и вызвать его метод ContainerFromItem(). – Anvaka

+0

Вы правы, так как я добавляю элементы в свое дерево, это myTree.Items.Add (новый TreeViewItem() {Header = myObject}); Вот почему он работает для меня. Извините за ввод в заблуждение. – Carlo

+0

Вы можете упростить код, который будет myTreeView.Items.OfType (), и вам не нужно будет проверять наличие нулевых или случайных элементов. – jwize

1

Карло было лучше, потому что он открывает все уровни

Это улучшает этот пример с небольшим количеством более кратким примере кода.

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

Вызов его с помощью этой строки кода

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

'foreach (TreeViewItem childItem в TreeItem.Items)' короче, чем ваш foreach, но работает так же хорошо. :) – Shakaron

+0

Это не сработает при использовании MVVM, потому что элементы не будут 'TreeViewItem'. См. Комментарий Анваки по поводу ответа Карло. – MickyD

2

если вы хотите расширить вручную, вы можете попробовать

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