Wpf树形列表控件

在这里插入图片描述

TreeList
TreeList的职责是读取一棵树的根节点,然后把整棵树(下称“数据树”)转换成一个列表,通过Items属性提供给DataGrid。并且TreeList要负责跟踪数据树的节点的增删情况,实时维护Items集合,以便数据树的变化能在DataGrid上反映出来。
TreeList独立完成这项工作比较困难,原因在于:每个数据树上的节点(下称“数据节点”)显示到表格中时,表格需要知道节点的一些信息,例如
节点在树的第几层,以便计算缩进量,节点当前是展开的还是没有展开,节点在表格中是可见还是不可见(可不可见取决于父节点一直到根节点的路径上是不是都是展开状态)
而对数据节点的类型没有过多限定,因此假设数据节点自己不知道上述信息,不提供展开、收起这样的操作,甚至都没有一个Parent属性用于导航到自己的父节点。并且:数据节点可能是可复用的,一个节点实例可能出现在多个父节点下,而在视图上,这些节点处于不同的位置,有的展开了,有的没展开……所有这些复杂性都需要TreeList来处理。
为了减轻TreeList的工作,创建了TreeItem节点。

TreeItem
TreeItem是是对单个数据节点的封装。它封装数据节点,并且提供数据节点本身不具备的但和视图显示密切相关的属性,例如节点在树的第几层、节点是否是展开的,节点在视图上当前是否可见等,还提供了了展开、收起等视图层面的操作。

TreeItem自身带有Parent和Children属性,能够自组织成一棵树(下称视图结构树)。逻辑上,这棵树的结构与数据源完全对等,但实际处理上会有一些变通,仅用户访问到的数据节点才会构造对应的TreeItem。

为了能反映数据源的节点的变动情况,TreeItem会侦听它的数据节点的子节点变化情况,并更新自身的子节点。并且确定这个更新是否有必要通知到TreeList。TreeItem还负责在执行展开操作之前,通知TreeList产生“某节点将要展开”的事件,因为可能要通知外部程序先行加载数据节点的子节点。

之前发布的作废,这是从老外的源码转换过来,并进行了扩展: 1>添加了水平和垂直网格线 2>添加了MVVM 3>添加了UI虚拟化的支持 4>支持自动填充列和最小宽度列 5>可绑定到Datatable,从而进行编辑操作 6>可装载海量数据,单层数据超过1W,瞬间完成,50W数据的滚动不卡顿 7>集成到ComboBox中 8>有两个主题,一个有类似传统的有折叠连接线的主题,另一个是当下的。 个人比较喜欢有折叠连接线的,结构可以更清晰。 特别强调一点:在海量数据的情况下,如果虚拟化UI开启,在展开大量数据的情况下,执行滚动操作可能导致程序假死,原因不明,希望有人能找到原因,并能告知!另外对于系统自带的TreeView测试发现,如果展开第二层,该层数据量很大,拖放也很卡,但DataGrid却非常顺滑,怀疑微软对层次结构的UI虚拟化仍没做好。 另外就个人感觉在目前的电脑配置下,UI虚拟化可以显著提高数据的加载速度,但一旦数据已加载后,执行拖放操作时,顺滑程度远不于非虚拟化的情况,原因也很简单,只要内存还够用,UI已加载的拖放肯定比UI虚拟的拖放好。 这次针对之前的发布主要在于完全取消了虚拟化,因为虚拟化会导致在大数据下滚动的卡死,垂直网格线不随滚动条滚动等各种意外的问题。 另外与树有关的: WPF TreeView的横向排布风格20170722(带动画) http://download.csdn.net/detail/maiker/9907400 Email: wuyang26@live.cn
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值