2009-04-05 14 views
27

Con respecto a una pregunta que he publicado anteriormente en (WPF: Correctly storing an object in a TreeViewItem)HierarchicalDataTemplates en un TreeView

¿Es posible haber anidado HierarchicalDataTemplate s en un TreeView?


Tome el ejemplo siguiente:

Código:

public class Artist 
{ 
     private readonly ICollection<Album> _children = new ObservableCollection<Album>(); 
     public string Name { get; set; } 

     public ICollection<Album> Albums 
     { 
      get { return _children;} 
     } 
} 

public class Album 
{ 
     private readonly ICollection<Track> _children = new ObservableCollection<Track>(); 
     public string Name { get; set; } 

     public ICollection<Track> Tracks 
     { 
      get { return _children;} 
     } 
} 

Xaml:

<TreeView x:Name="_treeView"> 
     <TreeView.Resources> 
       <HierarchicalDataTemplate DataType="{x:Type local:Artist}" ItemsSource="{Binding Albums}"> 
         <TextBlock Text="{Binding Name}"/> 
       </HierarchicalDataTemplate> 
     </TreeView.Resources> 
</TreeView> 

Como se puede ver de lo anterior, el TreeView es solamente bi nding de los artistas y sus álbumes. ¿Cómo puedo modificarlo para incluir también las Pistas de los álbumes (como una sub-lista de los álbumes, por ejemplo)?

Respuesta

44

No necesita una plantilla anidada aquí, ya que el control TreeView se encargará de anidarla según el tipo de datos que requiera. Así que solo defina Two HierarchicalDataTemplates para Album y Artist Type y una DataTemplate común para su clase Track.

<HierarchicalDataTemplate DataType="{x:Type local:Artist}" ItemsSource="{Binding Albums}" >   
     <TextBlock Text="{Binding Name}"/>     
    </HierarchicalDataTemplate> 
    <HierarchicalDataTemplate DataType="{x:Type local:Album}" ItemsSource="{Binding Tracks}" > 
     <TextBlock Text="{Binding Name}"/> 
    </HierarchicalDataTemplate>   
    <DataTemplate DataType="{x:Type local:Track}"> 
     <TextBlock Text="{Binding Name}"/> 
    </DataTemplate> 
+0

Excelente, exactamente lo que estaba buscando. Gracias por su respuesta. –

+1

Me ayudó también. –

+0

La pregunta ahora es cómo hacer eso si mi fuente treeview es un XmlDataProvider y quiero diferentes plantillas según un atributo definido en el nodo respectivo –