Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Having HierarchicalDataTemplates in a TreeView

With regards to a question I posted earlier on (WPF: Correctly storing an object in a TreeViewItem)

Is it possible to have nested HierarchicalDataTemplates in a TreeView?


Take the following example:

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> 

As you see from the above, the TreeView is only binding the Artists and their albums. How can I modify it to include also the Tracks of the albums (as a sub-list of the albums ie) ?

like image 232
Andreas Grech Avatar asked Apr 05 '09 20:04

Andreas Grech


People also ask

What is HierarchicalDataTemplate?

HierarchicalDataTemplate() Initializes a new instance of the HierarchicalDataTemplate class. HierarchicalDataTemplate(Object) Initializes a new instance of the HierarchicalDataTemplate class with the specified type for which the template is intended.

How do you bind TreeView?

The TreeView control supports declarative binding to an XML file by using XmlDataSource controls. You can bind a TreeView control to an XML file by creating an XmlDataSource control that represents the XML file and then assigning that XmlDataSource to your TreeView control.

What is TreeView item?

TreeViewItem is a HeaderedItemsControl, which means its header and collection of objects can be of any type (such as string, image, or panel). For more information, see the HeaderedItemsControl class.

What is TreeView in WPF?

The TreeView control provides a way to display information in a hierarchical structure by using collapsible nodes. This topic introduces the TreeView and TreeViewItem controls, and provides simple examples of their use.


1 Answers

You dont need a nested template here, since TreeView control will take care of nesting it based on the DataType it requires. So just define Two HierarchicalDataTemplates for Album and Artist Type and one ordinary DataTemplate for your Track class.

   <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> 
like image 126
Jobi Joy Avatar answered Oct 17 '22 06:10

Jobi Joy