2009-09-02 14 views
8

¿Cómo puedo expandir todo el TreeView en Silverlight?Expandir TreeView completo en Silverlight

EDIT: Aquí está el XAML:

<controls:TreeView x:Name="tv"> 
    <controls:TreeView.ItemTemplate> 
     <common:HierarchicalDataTemplate ItemsSource="{Binding Children}"> 
      <CheckBox IsChecked="{Binding Visible, Mode=TwoWay}" Content="{Binding Name}"/> 
     </common:HierarchicalDataTemplate> 
    </controls:TreeView.ItemTemplate> 
</controls:TreeView> 

Tal vez el uso de la ItemTemplate hace que la nula rentabilidad ItemContainerGenerator.ContainerFromIndex en cualquier índice?

Respuesta

9

primer lugar, leer este post: http://bea.stollnitz.com/blog/?p=55

En segundo lugar, heredad TreeViewItem y TreeView:

public class TreeViewItemEx : TreeViewItem { 
    protected override DependencyObject GetContainerForItemOverride() { 
     TreeViewItemEx tvi = new TreeViewItemEx(); 
     Binding expandedBinding = new Binding("IsExpanded"); 
     expandedBinding.Mode = BindingMode.TwoWay; 
     tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding); 
     return tvi; 
    } 
} 

public class TreeViewEx : TreeView { 
    protected override DependencyObject GetContainerForItemOverride() { 
     TreeViewItemEx tvi = new TreeViewItemEx(); 
     Binding expandedBinding = new Binding("IsExpanded"); 
     expandedBinding.Mode = BindingMode.TwoWay; 
     tvi.SetBinding(TreeViewItemEx.IsExpandedProperty, expandedBinding); 

     return tvi; 
    } 
} 

En tercer lugar, la unión propiedad de su modelo de "IsExpanded".

+1

Desde una perspectiva 2011 SL4, lo que tenía que hacer era crear las especializaciones como se muestra. Ya hace el enlace, por lo que no es necesario el tercero. Primero es solo para explicar. Enlazar a "IsExpanded" en un estilo implícito no funciona para mí y rescata con una excepción con respecto a una propiedad de solo lectura llamada ''. Ir a la figura ... – flq

1

yourtreeview.ExpandAll()

EDITAR: Martin indicó que el método ExpandAll() no existe para TreeView, sin embargo, que acaba de escribir el siguiente código en mi proyecto de Silverlight y intelisense recogido:

TreeView test = new TreeView(); 
      test.ExpandAll(); 

también puede establecer el atributo TreeView IsExpanded = "true" en el XAML aunque no estoy seguro de si eso se expande el árbol entero o sólo un nivel

+0

'ExpandAll' no es un método en' TreeView' en Silverlight. –

+0

Me refiero al control de Silverlight 3 'System.Windows.Controls.TreeView' en el ensamblado' System.Windows.Controls'.Esta clase no tiene un método 'ExpandAll'. Después de investigar un poco más, descubrí que Silverlight Toolkit tiene un método de extensión 'ExpandAll', y es probable que el método itellisense esté mejorando. –

+0

Expandir todo es un método de extensión pero no hace nada por lo que no ayuda. Lo siento :( –

4

Usted tendrá que utilizar TreeView.ItemContainerGenerator para obtener las instancias TreeViewItem y establecer IsExpanded en esas. Esto es un poco complejo ya que la expansión se realiza de forma asíncrona. Puede encontrar ejemplos de código en Internet o simplemente utiliza este método de extensión:

public static class TreeViewExtensions { 

    public static void ExpandAll(this TreeView treeView) { 
    for (Int32 i = 0; i < treeView.Items.Count; ++i) { 
     TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (item != null) 
     ExpandAll(item); 
    } 
    } 

    static void ExpandAll(TreeViewItem item) { 
    if (!item.IsExpanded) { 
     item.IsExpanded = true; 
     item.Dispatcher.BeginInvoke(() => ExpandAll(item)); 
    } 
    else { 
     for (Int32 i = 0; i < item.Items.Count; ++i) { 
     TreeViewItem childItem = item.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (childItem != null) 
      ExpandAll(childItem); 
     } 
    } 
    } 
+0

Supongo que debería funcionar (la muestra). –

+0

Sigo obteniendo nulo en TreeView.ItemContainerGenerator.ContainerFromIndex en todos los índices ... no entiendo por qué ... –

0

no veo, que la pregunta se responde, ya que el TreeViewItem siempre es NULL:

TreeViewItem item = treeView.ItemContainerGenerator.ContainerFromIndex(i) as TreeViewItem; 
     if (item != null) 
     ExpandAll(item); 

llamada UpdateLayout () en TreeView antes de intentar obtener TreeViewItem. Eso debería ayudar!

+1

Si no se ha cargado 'TreeView' no puede usar 'ExpandAll', así que supongo que está llamando al método demasiado pronto. Agregue un controlador para el evento' TreeView.Loaded' y llame a 'ExpandAll' allí. Otra opción es, por supuesto, llamar' UpdateLayout', pero prefiero el otro Enfoque –

0

si desea hacerlo en Xaml, se puede hacer utilizando el conjunto de temas de la herramienta silverlight & recursos de configuración de recursos. Código está disponible aquí: http://bea.stollnitz.com/blog/?p=54

3

TreeViewMenu.Dispatcher.BeginInvoke (() => TreeViewMenu.ExpandAll());

Simplemente agregue esta línea después de crear los elementos de la vista de árbol. ¡eso es todo!

18

Sé que esto es un poco tarde, pero me encontré con esto cuando buscando una respuesta y desde entonces han encontrado que en Silverlight 4 se puede utilizar tematización implícita de hacer esto:

<Style TargetType="controls:TreeViewItem"> 
    <Setter Property="IsExpanded" Value="True" /> 
</Style> 

En Silverlight 5 tendrá para agregar este código a la sección para lograr esto.

<Style TargetType="sdk:TreeViewItem"> 
    <Setter Property="IsExpanded" Value="True" /> 
</Style>