没有虚拟化的 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 这样的虚拟模式?

WPF DataGrid DataContext 极慢

WPF DataGrid Multiselect启用了虚拟化MVVM

具有循环虚拟化功能的C#WPF Datagrid

带有分组的 WPF DataGrid 虚拟化

WPF ListBox/ListView/DataGrid 列表滚动与虚拟化