2009-04-05 19 views
27

Liên quan đến một câu hỏi tôi đã đăng trước đây về (WPF: Correctly storing an object in a TreeViewItem)Có HierarchicalDataTemplates trong một TreeView

Có thể đã lồng HierarchicalDataTemplate s trong một TreeView?


Lấy ví dụ sau đây:

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> 

Như bạn thấy ở trên, TreeView chỉ là bi thu hút các nghệ sĩ và album của họ. Làm thế nào tôi có thể sửa đổi nó để bao gồm cả Tracks của album (như là một danh sách phụ của album tức là)?

Trả lời

44

Bạn không cần mẫu lồng nhau ở đây, vì điều khiển TreeView sẽ quản lý việc lồng nó dựa trên DataType mà nó yêu cầu. Vì vậy, chỉ cần xác định Two HierarchicalDataTemplates cho Album và Artist Type và một DataTemplate thông thường cho lớp Track của bạn.

<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

Tuyệt vời, chính xác những gì tôi đang tìm kiếm. Cảm ơn bạn vì câu trả lời. –

+1

Nó cũng giúp tôi. –

+0

Câu hỏi bây giờ là làm thế nào để làm điều đó nếu treeview itemssource của tôi là một XmlDataProvider và tôi muốn các mẫu khác nhau theo một thuộc tính được xác định trong nút tương ứng –