在 TreeView 中有 HierarchicalDataTemplates
Posted
技术标签:
【中文标题】在 TreeView 中有 HierarchicalDataTemplates【英文标题】:Having HierarchicalDataTemplates in a TreeView 【发布时间】:2010-10-17 16:53:34 【问题描述】:关于我之前在 (WPF: Correctly storing an object in a TreeViewItem) 上发布的一个问题
是否可以在 TreeView 中嵌套 HierarchicalDataTemplate
s?
举个例子:
代码:
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 只是绑定艺术家和他们的专辑。如何修改它以包含专辑的曲目(作为专辑的子列表,即)?
【问题讨论】:
【参考方案1】:这里不需要嵌套模板,因为 TreeView 控件会根据它所需的 DataType 负责嵌套它。因此,只需为专辑和艺术家类型定义两个 HierarchicalDataTemplate,为您的 Track 类定义一个普通 DataTemplate。
<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>
【讨论】:
非常好,正是我想要的。谢谢你的回答。 现在的问题是,如果我的 treeview itemssource 是 XmlDataProvider 并且我想要根据各自节点中定义的属性不同的模板,该怎么做 您可以在这些模板中 DataTrigger 该属性以上是关于在 TreeView 中有 HierarchicalDataTemplates的主要内容,如果未能解决你的问题,请参考以下文章
WPF 从 TreeView 中删除 ScrollViewer