WPF DataGrid v 快,分组 v 慢。如何在不使用分组的情况下显示组行

ndu*_*uru 8 wpf grouping datagrid

我有一个 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   
Run Code Online (Sandbox Code Playgroud)

然而,行被分成组。我需要显示一个文本字符串的组标题,并能够展开/折叠组。

我可以对 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  
Run Code Online (Sandbox Code Playgroud)

我可以通过添加一个包含组描述的额外列在 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  
Run Code Online (Sandbox Code Playgroud)

我想要的是两全其美,即快速和漂亮,能够像 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  
Run Code Online (Sandbox Code Playgroud)

知道如何以这种方式显示我的组标题吗?

Yvo*_*ila 8

这是一个老问题,但是我在这里添加了答案以供将来参考:


从 .Net 4.5 开始,微软增加了IsVirtualizingWhenGrouping属性。设置 的这个属性DataGrid可以True解决这个问题。

<DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True">
Run Code Online (Sandbox Code Playgroud)

来源: 本博客 (显然这个博客不再可用)

  • 为我工作。谢谢。它将窗口负载从 2 秒减少到毫秒:) (4认同)

Rac*_*hel 2

它最初加载速度可能很快,因为它使用虚拟化。这意味着它仅加载屏幕上的可见项目,而不是全部 10000 行和 60 列。我猜测分组时必须加载所有内容,这就是您遇到速度减慢的原因。

为了解决这个问题,我可能会研究创建自己的控件(使用虚拟化)并预先对数据进行分组。也许将 ItemsControl 绑定到分组数据,包括扩展器,当组扩展时,仅获取该组的数据并将其加载到另一个 itemscontrol 中。您可以使用 Grid.IsSharedScopeSize 和 SharedSizeGroup 来保持列宽一致。