Ответ 1
Я понимаю, что опаздываю на вечеринку здесь... но я столкнулся с этой проблемой недавно (используя DataGrid, встроенный в .NET 4). К сожалению, до сих пор нет виртуализации строк после того, как Grouping используется в DataGrid... но я нашел очень гладкий трюк повышения производительности, который, надеюсь, кто-то еще найдет полезным.
Предполагая, что вы используете ItemPresenter в расширителе вашего шаблона GroupItem, и по умолчанию ваш расширитель не расширяется, а затем попробуйте просто привязать видимость вашего ItemsPresenter к свойству Expander IsEnabled с помощью BooleanToVisibilityConverter по умолчанию:
<BooleanToVisibilityConverter x:Key="bool2vis" />
<DataGrid.GroupStyle>
<GroupStyle>
<GroupStyle.ContainerStyle>
<Style TargetType="{x:Type GroupItem}">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="{x:Type GroupItem}">
<Expander x:Name="exp">
<ItemsPresenter Visibility="{Binding ElementName=exp, Path=IsExpanded, Converter={StaticResource bool2vis}}" />
</Expander>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</GroupStyle.ContainerStyle>
</GroupStyle>
</DataGrid.GroupStyle>
Если вы столкнулись с проблемой, когда ваш DataGrid занимает очень много времени для загрузки (потому что он по существу вытаскивает каждую запись в вашем datagrid, даже если он в сложенном расширителе)... тогда использование вышеуказанного кода приведет к тому, что datagrid чтобы не рисовать свои записи до тех пор, пока вы не разберете группу, а затем вытащите записи только для этой группы.
Нижняя сторона заключается в том, что это помогает только в том случае, если ваши расширители сбрасываются по умолчанию, и все же строки не становятся виртуализированными (если у вас есть 100 элементов в расширенной группе, но только 20 подходят на экране, все 100 будут в то время, когда вы расширили группу).
Положительный момент заключается в том, что вы по существу выполняли ленивую загрузку своих записей DataGrid, поэтому вы не выполняете работу с рисунком, пока вам не нужно будет просматривать элементы (вы решили расширить группу). Для моего продукта у моего заголовка группы были встроенные кнопки для выполнения операций над всеми элементами в своей группе, поэтому чаще пользователь никогда не расширил группу, если только им не нужно было выполнять операцию над отдельным элементом внутри группы.
* Следует отметить, что если вы используете этот трюк, вы должны, вероятно, установить некоторые явные ширины или минимальную ширину в заголовки столбцов (потому что элементы не рисуются при первом загрузке DataGrid, поэтому заголовки столбцов не могут авторизоваться соответствует самому большому элементу).
Надеюсь, настоящая виртуализация будет реализована в будущем пакете обновлений, но если нет, я надеюсь, что это поможет кому-то еще!
Update
Похоже, эта проблема будет исправлена в .NET 4.5 с новым прикрепленным свойством VirtualizingPanel.IsVirtualizingWhenGrouping.