2009-04-05 2 views
27

Что касается вопроса я отправил ранее (WPF: Correctly storing an object in a TreeViewItem)Наличие HierarchicalDataTemplates в TreeView

Можно ли вложенные HierarchicalDataTemplate S в TreeView?


Рассмотрим следующий пример:

Код:

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> 

Как видно из вышеизложенного, TreeView только би исполнителей и их альбомов. Как я могу изменить его, чтобы включить также треки альбомов (в качестве подписок для альбомов, т.е.)?

ответ

44

Вам не нужен вложенный шаблон здесь, так как элемент управления TreeView позаботится о его вложенности на основе требуемого DataType. Поэтому просто определите Two HierarchicalDataTemplates для альбома и типа исполнителя и один обычный DataTemplate для вашего класса 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

Отлично, именно то, что я искал. Спасибо за ваш ответ. –

+1

Это тоже помогло. –

+0

Вопрос теперь в том, как это сделать, если my tree items itemssource является XmlDataProvider, и мне нужны разные шаблоны в соответствии с атрибутом, определенным в соответствующем узле. –

Смежные вопросы