WPF DataGrid - быстро, группировка - медленно.Как отобразить строки группы без использования группировки - PullRequest
4 голосов
/ 11 ноября 2010

У меня есть 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 ]

1 голос
/ 09 февраля 2012

Я сейчас работаю над точно такой же проблемой.WPF Datagrid не может виртуализироваться при группировании, поскольку это ограничение элемента управления Expander, используемого для представления групп, который сам не может быть виртуализирован (так как использует ItemsPresenter, а не ItemsControl).

A это обходной путь (прокрутите вниз до Поддельная группировка с помощью ViewModel ).В этом сообщении в блоге автор реализует группы в модели представления, имея иерархию данных, а заголовки групп отображаются в виде строки с пользовательским стилем.Таким образом, все строки - без расширителей или групп как таковых.Это может позволить вам виртуализировать и получить необходимую производительность.

Я сейчас расследую это.

1 голос
/ 11 ноября 2010

Вероятно, он изначально загружается быстро, потому что использует виртуализацию.Это означает, что он загружает только видимые элементы на экране, а не все 10000 строк и 60 столбцов.Я предполагаю, что при группировке необходимо загрузить все, поэтому вы испытываете замедление.

Чтобы исправить это, я бы, вероятно, исследовал создание собственного элемента управления (с виртуализацией) и сгруппировал данные заранее.Возможно, свяжите ItemsControl с сгруппированными данными, включите расширитель, и, когда группа будет расширена, получите данные только для этой группы и загрузите их в другой элемент itemscontrol.Вы можете использовать Grid.IsSharedScopeSize и SharedSizeGroup, чтобы поддерживать постоянную ширину столбцов.

0 голосов
/ 19 сентября 2017

Это старый вопрос, однако я добавлю здесь ответ для будущих ссылок:


Начиная с .Net 4.5, Microsoft добавила свойство IsVirtualizingWhenGrouping.Установка этого свойства DataGrid в True решает эту проблему.

<DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True">

Источник: Этот блог

...