2009-09-28 8 views
32

C'è un modo per espandere automaticamente tutti i nodi da una vista ad albero in WPF? Ho cercato e non ho nemmeno trovato una funzione di espansione nella proprietà di treeview.AutoExpand treeview in WPF

Grazie

+0

Ho dimenticato di dire che non ho TreeviewItem, ma diversi tipi di elementi nel mio albero. –

risposta

57

È può impostare ItemContainerStyle e utilizzare la proprietà 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> 

Se avete bisogno di fare questo dal codice, è possibile scrivere viewmodel per i tuoi articoli visualizzazione ad albero, e si legano proprietà IsExpanded al corrispondente da modello. Per ulteriori esempi si riferiscono a grande articolo da Josh Smith su CodeProject: risposta Simplifying the WPF TreeView by Using the ViewModel Pattern

3

Questo è quello che io uso:

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

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

Al fine di farlo funzionare è necessario chiamare questo metodo in un ciclo foreach per il nodo principale:

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

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

Ciao Carlo. Questo non funzionerà se hai qualcosa di diverso da TreeViewItem nella tua raccolta di articoli. Se vuoi essere sicuro che questo approccio funzioni in ogni caso, dovresti usare ItemContainerGenerator dal tuo oggetto TreeView e chiamare il suo metodo ContainerFromItem(). – Anvaka

+0

Hai ragione, il modo in cui aggiungo gli oggetti al mio treeview è myTree.Items.Add (new TreeViewItem() {Header = myObject}) ;, Ecco perché funziona per me. Ci scusiamo per fuorviando. – Carlo

+0

È possibile semplificare il codice in myTreeView.Items.OfType () e non sarà necessario verificare la presenza di null o caso gli articoli. – jwize

1

di Carlo era migliore perché apre tutti i livelli

Questo migliora l'esempio con un piccolo esempio di codice più conciso.

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

Chiamatela utilizzando questa riga di codice

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

'foreach (TreeViewItem childItem in TreeItem.Items)' è più corto di foreach ma funziona altrettanto bene. :) – Shakaron

+0

Questo non funzionerà quando si utilizza MVVM perché gli elementi non saranno 'TreeViewItem'. Vedi il commento di Anvaka sulla risposta di Carlo. – MickyD

2

se si desidera espandere manualmente si può provare

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