WPF自定义TreeView显示结构通用类
2012-08-28 16:03
507 查看
在WPF中,专门有HierarchicalDataTemplate用于自定义显示TreeView和ListBox的层次结构,结合后台定义的数据,得以实现五花八门的外观。我现在先简要说明一下HierarchicalDataTemplate的使用方式:
上面是树的一个结点类,包括了一个Header字段和子结点列表,下面则是对应的前台代码:
注意到,HierarchicalDataTemplate的ItemsSource就是层叠显示的关键,它可以遍历对应数据的所有Childs字段,并显示成<Label ... />的形式。接下来,把DataItem类型的数据集合赋给TreeView控件的ItemSource就完成了树形结构的显示:
所得结果如下图所示:
通用树结点类
这个类实现了INotifyPropertyChanged接口,能够更好地实现前台数据刷新,并且只初始化得当,还可以直接往上追踪父结点,删除、添加子结点。
转载请注明原址:/article/5813031.html
public class DataItem { public string Header { get; set; } public IList<DataItem> Childs { get; set; } }
上面是树的一个结点类,包括了一个Header字段和子结点列表,下面则是对应的前台代码:
<Grid> <Grid.Resources> <HierarchicalDataTemplate x:Key="myDataTemplate" ItemsSource="{Binding Childs}"> <Label Content="{Binding Header}" /> </HierarchicalDataTemplate> </Grid.Resources> <TreeView x:Name="TV_Test" ItemTemplate="{StaticResource myDataTemplate}" /> </Grid>
注意到,HierarchicalDataTemplate的ItemsSource就是层叠显示的关键,它可以遍历对应数据的所有Childs字段,并显示成<Label ... />的形式。接下来,把DataItem类型的数据集合赋给TreeView控件的ItemSource就完成了树形结构的显示:
List<DataItem> dataList = new List<DataItem>(); DataItem item1 = new DataItem { Header = "结点1" }; item1.Childs = new List<DataItem>(); item1.Childs.Add(new DataItem { Header = "结点1-1" }); item1.Childs.Add(new DataItem { Header = "结点1-2" }); dataList.Add(item1); dataList.Add(new DataItem { Header = "结点2" }); TV_Test.ItemsSource = dataList;
所得结果如下图所示:
通用树结点类
using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; namespace EntityFramework.Common { /// <summary> /// 实现了INotifyPropertyChanged接口通知的轻量级基类 /// </summary> public abstract class ObservableBase : INotifyPropertyChanged { public event PropertyChangedEventHandler PropertyChanged; protected void RaisePropertyChanged(string propertyName) { if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } } /// <summary> /// 树数据类 /// </summary> public class TreeViewData : ObservableBase { #region 私有字段 private string _Header; private object _Tag; private TreeViewData _Parent; private ObservableCollection<TreeViewData> _Childs = new ObservableCollection<TreeViewData>(); #endregion #region 公有属性 /// <summary> /// 名字 /// </summary> public string Header { get { return _Header; } set { _Header = value; RaisePropertyChanged("Header"); } } /// <summary> /// 标签 /// </summary> public object Tag { get { return _Tag; } set { _Tag = value; RaisePropertyChanged("Tag"); } } /// <summary> /// 父项 /// </summary> public TreeViewData Parent { get { return _Parent; } set { _Parent = value; RaisePropertyChanged("Parent"); } } /// <summary> /// 子项 /// </summary> public ObservableCollection<TreeViewData> Childs { get { return _Childs; } set { _Childs = value; RaisePropertyChanged("Childs"); } } #endregion #region 方法函数 public TreeViewData() { } public TreeViewData(string header) { _Header = header; } public TreeViewData(string header, object tag, TreeViewData parent = null) { _Header = header; _Tag = tag; _Parent = parent; } /// <summary> /// 添加子元素 /// </summary> /// <param name="childs">子元素</param> /// <returns>个数</returns> public void AddChild(TreeViewData child) { child.Parent = this; _Childs.Add(child); } /// <summary> /// 添加子元素集合 /// </summary> /// <param name="childs">子元素</param> /// <returns>个数</returns> public int AddChilds(IEnumerable<TreeViewData> childs) { int nCount = 0; foreach (TreeViewData item in childs) { AddChild(item); ++nCount; } return nCount; } /// <summary> /// 将指定名称的所有子节点从父元素中移除 /// </summary> /// <param name="parent">父元素</param> /// <param name="name">子节点名称</param> public void RemoveChilds(TreeViewData parent, string name) { for (int i = 0; i < parent.Childs.Count; ++i) { if (parent.Childs[i].Header == name) parent.Childs.Remove(parent.Childs[i]); } } public override string ToString() { return _Header; } #endregion } }
这个类实现了INotifyPropertyChanged接口,能够更好地实现前台数据刷新,并且只初始化得当,还可以直接往上追踪父结点,删除、添加子结点。
转载请注明原址:/article/5813031.html
相关文章推荐
- 如何实现具有层次结构的 TreeView <四> (WPF/TreeView/Style/Template)
- WPF Grid自定义行列时,边框的显示控制
- 部门树形结构,使用Treeview控件显示部门
- WPF中一个比较完整的树形结构<TreeView>和右键菜单<ContextMenu>
- WPF TreeView自定义数据模板展开到指定层
- TreeView 控件用于在树结构中显示分层数据,例如目录或文件目录等
- WPF_拖拽任意XML结构生成TreeView
- Unity3D编辑器之自定义窗口显示文件夹结构
- Wpf之在Treeview上用Tooltip显示图片
- 用TreeView显示XML文件的结构
- 使用数据绑定和 WPF 自定义数据显示
- C#自定义DataGridViewColumn显示TreeView
- [No0000D1]WPF—TreeView无限极绑定集合形成树结构
- IE Web Control介绍以及TreeView 控件树形结构不能显示的问题
- 学习 TTreeView [13] - 在 TTreeView 中显示目录结构(的函数)
- treeview显示数据表树结构。
- 自定义树形结构组件—TreeView
- WPF:使用Json.NET在TreeView中树形显示JSON数据
- WPF中确保显示TreeView选中的Item
- WPF 在页面中按照自定义格式显示DateTime数据