项目场景:
需要一个TreeViewItem
里面有三层,每层的样式都不同,,因此需要给三层使用不同的模板。
使用TreeViewItem
的原因是为了使用HierarchicalDataTemplate
绑定多层数据。数据来源是一个Node对象的列表
public class Node : INotifyPropertyChanged
{
public Node(string szFatherNodeName = "")
{
Nodes = new List<Node>();
}
public string NodeName { get; set; }
private bool? isSelected = false;
public bool? IsSelected
{
get { return this.isSelected; }
set
{
this.isSelected = value;
this.OnPropertyChanged();
}
}
public List<Node> Nodes { get; set; }
}
<TreeViewItem Style="{StaticResource TreeViewItemStyle_Root}" ItemsSource="{Binding NodeList}" ItemContainerStyle="{StaticResource TreeViewItemStyle_Secondery}" >
<TreeViewItem.Header>
<TextBlock Text="RootHeaderText"/>
</TreeViewItem.Header>
<TreeViewItem.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:Node}" ItemsSource="{Binding Path=Nodes}" ItemContainerStyle="{StaticResource TreeViewItemStyle_Leaf}" >
<CheckBox Content="{Binding Path=NodeName}" IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
<HierarchicalDataTemplate.ItemTemplate>
<DataTemplate>
<CheckBox Content="{Binding Path=NodeName}" IsChecked="{Binding IsSelected, Mode=TwoWay}"/>
</DataTemplate>
</HierarchicalDataTemplate.ItemTemplate>
</HierarchicalDataTemplate>
</TreeViewItem.ItemTemplate>
</TreeViewItem>
第一层使用的样式是TreeViewItemStyle_Root直接写在Style
里,第二层的样式TreeViewItemStyle_Secondery写在第一层的ItemContainerStyle
里,第三层的样式TreeViewItemStyle_Leaf写在第二层的内容层级模板HierarchicalDataTemplate
的ItemContainerStyle
里。
注意,这里的Style都是Header
的样式,层级模板也是给每一层的Header
指定内容。