我有一个WPF DataGrid,它显示的数据集超过60列,行数高达10000。 DataGrid非常快速地加载完整的数据集 并很好地处理它们。
colA colB colC colD colE ...
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
然而,行被分成组。我需要显示一个组头,它是一个文本字符串,并且能够展开/折叠组。
我可以为DataGrid使用分组,看起来很好,但非常慢,以便最初显示大组。
colA colB colC colD colE ...
^ group title A
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
^ group title B
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
我可以通过添加一个包含组描述的额外列来自己在DataGrid外部进行分组。然后,我可以通过更改提供给网格的数据集来折叠/展开任何组。这是非常快,但看起来很垃圾,因为它浪费了很多空间,尤其是长队冠军。
group colA colB colC colD colE ...
group title A
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
group title B
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
我想要的是两个世界中最好的,即快速和漂亮, 能够像DataGrid分组一样显示数据, 但要在外部进行分组。
colA colB colC colD colE ...
^ Very long comment about the data ...
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
^ Another arbitrarily long comment...
1 2 3 4 5
5 6 7 8 9
2 3 4 3 4
知道如何以这种方式显示我的群组标题吗?
答案 0 :(得分:1)
它可能最初加载速度快,因为它正在使用虚拟化。这意味着它只加载屏幕上的可见项,而不是所有10000行和60列。我猜测,当分组它必须加载所有这就是你遇到减速的原因。
要修复它,我可能会调查创建您自己的控件(使用虚拟化)并事先对数据进行分组。也许将ItemsControl绑定到分组数据,包括扩展器,当组扩展时,只获取该组的数据并将其加载到另一个itemscontrol中。您可以使用Grid.IsSharedScopeSize和SharedSizeGroup来保持列宽一致。
答案 1 :(得分:1)
我正在研究这个完全相同的问题。 WPF Datagrid在分组时无法虚拟化,因为这是用于表示组的Expander控件的限制,这些组本身无法虚拟化(因为使用ItemsPresenter,而不是ItemsControl)。
A workaround is this(借助ViewModel 向下滚动到假冒组合)。在此博客文章中,作者通过将数据层次结构和组标题呈现为自定义样式行来实现viewmodel中的组。所以它的所有行 - 本身没有扩展器或组。此可能允许您虚拟化并获得所需的性能。
我正在调查此事。
答案 2 :(得分:0)
这是一个老问题,但我在这里添加答案以供将来参考:
自.Net 4.5以来,Microsoft已添加IsVirtualizingWhenGrouping
属性。将DataGrid
的此属性设置为True
可解决此问题。
<DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True">
来源:This blog