一款着眼性能的轻量级 Data Grid——WPF Table View

发布于:2012 年 3 月 27 日 23:07

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

阅读数:3271 发布于:2012 年 3 月 27 日 23:07

更多 语言 & 开发 相关课程,可下载【 极客时间 】App 免费领取 >

评论

发布
暂无评论
  • 组件基础及组件注册

    2019 年 3 月 18 日

  • 指令式绘图系统:如何用 Canvas 绘制层次关系图?

    怎么用图表体现出中国各个省份和城市之间的关系?Canvas2D能做什么?它有什么局限性?

    2020 年 6 月 24 日

  • Syncfusion WinRT 2013.1 发布,新增 14 种控件

    Syncfusion发布了WinRT 2013 volume 1版本,该版本新增了14种控件,有了它你可以使用Gauge、Grid、PDF等控件构建Windows Store应用程序。

    2013 年 2 月 21 日

  • 书评和采访:ExtJS in Action

    Jesus Garcia 编写的《ExtJS in Action》是一本介绍跨浏览器JavaScript库ExtJS的书,ExtJS用于构建富互联网应用(Rich Internet Application)。ExtJS包含大量的组件、可扩展的组件模型,提供了易用的API来构建针对基于JavaScript的Web应用的完整、稳定的平台。

    2011 年 3 月 24 日

  • 几行代码就能完成 Web 组件的数据绑定

    现有的框架提供了一种通过数据绑定编写视图的声明式途径,这是原生Web组件天生不具备的能力。这一观点本身没错,但其实Web组件是很容易实现数据绑定的。

    2019 年 9 月 5 日

  • 把 WPF 作为一种富客户端技术

    WPF的出现使开发视觉效果非凡的应用程序变得容易了不少,不过它其实作为一种开发前端富客户端应用程序的技术也非常有竞争力,而应用程序的后端服务可以使用如Java、Ruby或.NET等任何技术。这篇文章将会把WPF和其他一些技术,例如AJAX/DHTML、Swing或Flash进行对比;同时文章中也会分享一些使用WPF作为客户端的合适场景,这些示例会使用Java作为后台开发技术。

    2008 年 3 月 25 日

  • 如何使用 video.js 播放多媒体文件?

    video.js是目前在浏览器上最好用的开源流媒体播放器,功能非常强大,是播放音视频直播媒体流必不可少的播放工具。

    2019 年 10 月 8 日

  • iOS 原生、大前端和 Flutter 分别是怎么渲染的?

    今天这篇文章,我首先和你说了渲染的原理,然后分别和你展开了原生、大前端、Flutter 是怎么渲染的。

    2019 年 6 月 18 日

  • 用 Acropolis 分离视图和业务逻辑

    微软的GUI工具集一直倾向于鼓励开发者将业务逻辑和表现层紧密地绑定在一起。如果比较传统的VB、ASP或者WinForms和ASP.NET——一直以来都没什么改变。不过Acropolis正在视图改变这一状况。从MFC时代开始,这是微软第一次看上去认真考虑分离的概念。

    2007 年 6 月 20 日