2009-04-05 12 views
27

Mit Bezug auf eine Frage, die ich früher geschrieben (WPF: Correctly storing an object in a TreeViewItem)Mit HierarchicalDataTemplates in einem TreeView

Ist es möglich, HierarchicalDataTemplate s in einem TreeView verschachtelt haben?


Nehmen Sie das folgende Beispiel:

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> 

Wie Sie aus dem oben sehen, die TreeView ist nur Bi die Künstler und ihre Alben. Wie kann ich es ändern, um auch die Tracks der Alben einzuschließen (zB als Unterliste der Alben)?

Antwort

44

Sie benötigen hier keine verschachtelte Vorlage, da das TreeView-Steuerelement die Verschachtelung anhand des erforderlichen Dateityps übernimmt. Definieren Sie einfach zwei HierarchicalDataTemplates für Album und Artist Type und ein gewöhnliches DataTemplate für Ihre Track-Klasse.

<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

Ausgezeichnet, genau das, was ich gesucht habe. Vielen Dank für Ihre Antwort. –

+1

Es hat mir auch geholfen. –

+0

Die Frage ist jetzt, wie das zu tun, wenn meine treeview itemssource ein XmlDataProvider ist und ich verschiedene Templates nach einem Attribut im jeweiligen Knoten definiert –