2009-09-28 9 views
32

¿Hay alguna forma de expandir automáticamente todos los nodos desde una vista en árbol en WPF? Busqué y ni siquiera encontré una función expandir en la propiedad treeview.vista en árbol AutoExpand en WPF

Gracias

+0

Olvidé mencionar que no tengo TreeviewItem, pero diferentes tipos de elementos en mi árbol. –

Respuesta

57

Usted puede establecer ItemContainerStyle y usar la propiedad 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> 

Si tiene que hacerlo desde el código, puede escribir modelo de vista para sus artículos de vista de árbol, y se unen a la propiedad IsExpanded correspondiente del modelo. Para más ejemplos se refieren a gran artículo de Josh Smith en CodeProject: Respuesta Simplifying the WPF TreeView by Using the ViewModel Pattern

3

Esto es lo que yo uso:

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

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

Con el fin de que funcione debe llamar a este método en un bucle foreach para el nodo raíz:

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

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

Hola Carlo. Esto no funcionará si tiene algo diferente de TreeViewItem en su colección de Artículos. Si desea estar seguro de que este enfoque funciona en cualquier caso, debe usar ItemContainerGenerator de su objeto TreeView y llamarlo método ContainerFromItem(). – Anvaka

+0

Tiene razón, la forma en que agrego los elementos a mi vista de árbol es myTree.Items.Add (new TreeViewItem() {Header = myObject}) ;, por eso funciona para mí. Lo siento por ser engañoso. – Carlo

+0

Puede simplificar el código para que sea myTreeView.Items.OfType () y no tendrá que comprobar si los elementos están vacíos o no. – jwize

1

de Carlo era mejor, ya que abre todos los niveles

Esta mejora sobre ese ejemplo con un pequeño ejemplo de código más conciso.

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

de llamadas mediante el uso de esta línea de código

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

'foreach (TreeViewItem childItem en TreeItem.Items)' es más corto que tu foreach, pero funciona igual de bien. :) – Shakaron

+0

Esto no funcionará cuando use MVVM porque los artículos no serán 'TreeViewItem'. Ver el comentario de Anvaka sobre la respuesta de Carlo. – MickyD

2

si desea expandir manualmente se puede tratar

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