没有虚拟化的 WPF DataGrid 性能
Posted
技术标签:
【中文标题】没有虚拟化的 WPF DataGrid 性能【英文标题】:WPF DataGrid Performance without virtualization 【发布时间】:2014-08-02 23:36:56 【问题描述】:我刚收到一个关于微软 PresentationFramework 的问题DataGrid
:
我有一个ObservableCollection<TestModel>
。 TestModel
是一个具有 20 个 Int 属性的简单类……仅此而已。在我的测试中,我的ObservableCollection
中有 50 个条目。
所以总的来说我有 1000 个细胞(20*50)。所有这些单元格都会同时显示,因此实际上无法进行虚拟化。
这是我的网格:
<DataGrid AutoGenerateColumns="true" RowHeight="20" ItemsSource="Binding DataGridModelSource"/>
在我看来,要渲染的 1000 个单元格并不多……尽管根据我运行此测试的系统,渲染这 1000 个单元格需要大约 1 到 3 秒。很多,不是吗?
我对一些自定义 DataGrids
进行了相同的测试,例如来自 C1、Infragistics、Mindscape 或 DX 的测试,并且使用所有这些网格将这 1000 个单元格的渲染时间减少到大约 100 毫秒。
那么微软DataGrid
有什么意义呢?有什么方法可以提高性能吗?我错过了什么吗?
【问题讨论】:
您确定 1-3 秒是渲染时间,而不是数据加载时间吗?肯定是很多,你有转换器,calcualtions? 是的,我正在测量数据加载时间.. 大约 50 毫秒。我没有任何转换器或计算。那只是随机的 int 值,在文本块列中抛出。 DataGrid 很“重”,但 1-3 秒似乎很高。你需要编辑吗? ListView / GridView 更快。 好吧,不幸的是我需要分组、排序和编辑。 为什么您认为不需要虚拟化? 【参考方案1】:使用 BindingList (https://msdn.microsoft.com/en-us/library/ms132679%28v=vs.110%29.aspx) 代替 ObservableCollection。 问题是你必须自己实现分组、排序等,但它应该更快。
您可以做的其他事情是简化当前主题的样式。您可以使用https://wpfinspector.codeplex.com/ 来查找某些内容(即使它是默认的 Windows 主题)
【讨论】:
以上是关于没有虚拟化的 WPF DataGrid 性能的主要内容,如果未能解决你的问题,请参考以下文章
wpf datagrid 有没有像 winforms DataGridView 这样的虚拟模式?