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

时间:2010-11-11 14:33:16

标签: wpf datagrid grouping

我有一个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  

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

3 个答案:

答案 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