2009-04-05 9 views
27

En ce qui concerne une question que j'ai posté plus tôt (WPF: Correctly storing an object in a TreeViewItem)Avoir HierarchicalDataTemplates dans un TreeView

Est-il possible d'avoir niché HierarchicalDataTemplate s dans un TreeView?


Prenons l'exemple suivant:

code:

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> 

Comme vous le voyez de ce qui précède, le TreeView est seulement bi trouver les artistes et leurs albums. Comment puis-je le modifier pour inclure également les pistes des albums (comme une sous-liste des albums à savoir)?

Répondre

44

Vous n'avez pas besoin d'un modèle imbriqué ici, car le contrôle TreeView prendra soin de l'imbriquer en fonction du DataType dont il a besoin. Il suffit donc de définir deux HierarchicalDataTemplates pour le type Album et Artist et un DataTemplate ordinaire pour votre classe 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

Excellent, exactement ce que je cherchais. Merci pour votre réponse. –

+1

Ça m'a aidé aussi. –

+0

La question est maintenant de savoir comment faire si mon itemsource treeview est un XmlDataProvider et que je veux des templates différents en fonction d'un attribut défini dans le node correspondant –