Graham Knight 为 WPF 开发了一款轻量级、高性能的数据网格(Data Grid)。这款被称为 WPF Table View 的数据网格使用微软公开许可协议(Microsoft Public License,简称 Ms-PL)发布在 CodePlex 上。
InfoQ:请问是 WPF 数据网格的什么缺点让你下决心自己开发一款新的数据网格?
我不用 WPF 数据网格的主要原因是由于它的性能问题。我需要能够使用动态定义的列以及列数据模板来查看超过 10 万行的数据,而当我使用 WPF 数据网格做这些工作时,它的用户体验不是很好。我也尝试过使用一些商业网格控件,它们虽然性能好了一些,但是对于我的需求而言最终还是显得过于复杂并且难以了解。
InfoQ:你这款数据网格的设计理念是什么?是打算把它设计成一个大概然后进行扩展,还是说你想为其加入丰富的功能集合以用来覆盖大多数的使用案例?
毫无疑问,这是一个大概的解决方案。我并没有为不同的列类型、编辑模式和主题包添加内置支持,因为这些特性都可以通过非常简单地使用一些数据模板来添加完成,所以我不需要把它们加入到组件中。
我希望创建的是一款网格组件,它易于理解,并且在呈现数据模板化后的数据时能够拥有良好的性能。如果你想要充分利用 Table View,就需要了解一点关于数据绑定和数据模板的知识。不过考虑到这些是 WPF 的基础知识,所以任何使用该控件的用户都应当能够处理这点。
未来我可能会增强一下这个控件的功能集,不过不会以牺牲速度和基本的易用性为代价。
InfoQ:10 万行数据对于用户来说信息量很大。之前你为什么需要一次显示这么多的信息?
我目前在金融业工作,我得要跨越不同的股票组合提供实时的损益报告。随着股票价格的波动,TableView 可以为报告中的每一行显示频繁变化的数据。此外,我还要计算和渲染损益数据的多级聚合(multi-level aggregation),这意味着所有的数据需要加载进内存以保持合理的性能。
InfoQ:那么你觉得哪些特性是它的精华所在?
性能和虚拟化。我主要的需求是为了显示数据而非修改数据,但这并不是说 TableView 不能用作修改数据,其实你只需要自己编写视图模型以及数据模板,就可以使数据可被编辑。
保持 TableView 模型简单意味着底层数据和显示数据之间的层次较少。使用虚拟化是出于性能原因,同样也因为我需要管理的数据量很大。TableView 只能为即将显示的行创建行容器(row container),并在用户滚动表格时回收这些容器,这大大降低了控件使用的内存及资源。
同时这也是一个绝佳的机会学习 ItemsControl 和无样式(lookless)控件如何工作。
InfoQ:你能使用一些像虚拟化堆栈面板(VirtualizingStackPanel)的控件吗,还是说你得重头开始构建自己的版本?
我用到了虚拟化堆栈面板,这块没有理由重新发明轮子。多亏了 Dr WPF 关于 ItemsControl、控件模板和无样式控件模型的精彩系列文章,让我真正了解到了底层发生的工作。
InfoQ:到目前为止,在这个项目上你投入了多少时间?
大概只有一个月,但是展开说要超过 6 个月,因为背后我做了一些事情。而大部分时间我都是花在研究怎样将创建一个网格类型控件的不同方面放到一起,以及尝试学习现有组件,如 Listbox、ListView 和 Data Grid 如何工作。
查看英文原文: WPF Table View, a Lightweight Data Grid Built for Performance
评论