TreeView控件可在树结构中显示分层数据,其中的项可以展开和折叠。它可以包含多种类型的控件,如Button、Lable、Image等控件,可以通过绑定到数据源并使用HieratchicalDataTemplate对象来填充其树。可以修改默认ControlTemplate以使控件具有独特的外观。
这里举一个完整的TreeView实例来进行说明。本节主要实现自定义控件样式+数据源绑定+动态添加父子节点的功能。效果如下:
1、主窗体中加入TreeView控件
<TreeView x:Name="treeView" Background="Transparent" MinHeight="280" Width="200"
ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Auto"
MouseDoubleClick="TreeView_MouseDoubleClick">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}">
<TextBlock x:Name="showName" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,8,0,0" Height="26"
FontSize="{Binding Path=SetFontSize}" FontWeight="{Binding Path=SetFontWeight}" Text="{Binding Path=NodeName, Mode=TwoWay}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
由于我们的这个TreeView控件父子节点字体样式、背景颜色等不同,所以使用Binding的方式通过后台进行设置。
2、TreeView的Model:TreeViewNode.cs
public class TreeViewNode : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
}
#region 属性字段
private int id;
/// <summary>
/// 节点ID
/// </summary>
public int Id
{
get
{
return id;
}
set
{
id = value;
}
}
private int parentId;
/// <summary>
/// 父节点ID
/// </summary>
public int ParentId
{
get
{
return parentId;
}
set
{
parentId = value;
}
}
private string nodeName;
/// <summary>
/// 节点名称(最多六个字符)
/// </summary>
public string NodeName
{
get
{
return nodeName;
}
set
{
nodeName = value;
if (nodeName.Length > 6)
{
//非添加项考虑字符长度
if (this.isNodeAdd != true && this.isChildNodeAdd != true)
{
nodeName = nodeName.Substring(0, 6);
}
}
OnPropertyChanged("NodeName");
}
}
private bool isChildNode;
/// <summary>
/// 是否是子节点
/// </summary>
public bool IsChildNode
{
get
{
return isChildNode;
}
set
{
isChildNode = value;
}
}
private bool isNodeAdd;
/// <summary>
/// 是否添加节点
/// </summary>
public bool IsNodeAdd
{
get
{
return isNodeAdd;
}
set
{
isNodeAdd = value;
}
}
private bool isChildNodeAdd;
/// <summary>
/// 是否是添加子节点
/// </summary>
public bool IsChildNodeAdd
{
get
{
return isChildNodeAdd;
}
set
{
isChildNodeAdd = value;
}
}
private ObservableCollection<TreeViewNode> childNodes;
/// <summary>
/// 子节点数据
/// </summary>
public ObservableCollection<TreeViewNode> ChildNodes
{
get
{
if (childNodes == null)
{
childNodes = new ObservableCollection<TreeViewNode>();
childNodes.CollectionChanged += new NotifyCollectionChangedEventHandler(OnMoreStuffChanged);
}
return childNodes;
}
set
{
childNodes = value;
}
}
private void OnMoreStuffChanged(object sender, NotifyCollectionChangedEventArgs e)
{
if (e.Action == NotifyCollectionChangedAction.Add)