Расширитель с виртуализацией внутри WPF Datagrid - PullRequest
2 голосов
/ 08 февраля 2012

У меня проблема с производительностью в прототипе, над которым я работаю.Требуется создать сетку данных с несколькими синхронизированными замороженными панелями, с поддержкой группировки, сортировки и т. Д. ... Подробнее о строящейся сетке см. этот предыдущий вопрос .

Теперь,У меня есть вопрос, связанный с группировкой и, в частности, Expanders.У меня есть GroupStyle, определенный следующим Xaml и взятый из этого сообщения в блоге .

    <!--Default GroupStyle-->
    <GroupStyle x:Key="gs_Default">
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <DataGridRowsPresenter/>
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <StackPanel>
                    <TextBlock Text="{Binding Path=Name}" FontWeight="Bold" Padding="3"/>
                </StackPanel>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate TargetType="{x:Type GroupItem}">
                            <Expander x:Name="exp"
                                      BorderBrush="#FFA4B97F" 
                                      BorderThickness="0,0,0,1" 
                                      IsExpanded="{Binding Path=Items[0].IsExpanded}">
                                <Expander.Header>
                                    <DockPanel TextBlock.FontWeight="Bold">
                                        <TextBlock Text="{Binding Path=Name}" Margin="5,0,5,0" />
                                        <TextBlock Text="{Binding Path=ItemCount}"/>
                                    </DockPanel>
                                </Expander.Header>
                                <ItemsPresenter/>                       
                            </Expander>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>

Расширитель не виртуализирован, и у нас возникает проблема с производительностью, когда в группе несколько сотен строк.

Кто-нибудь раньше принимал это во внимание и исправил?В идеале я ищу Виртуализирующий расширитель, и я видел обходные пути, такие как этот (который не решает проблему).

Ответы [ 2 ]

3 голосов
/ 21 августа 2012

Если вы используете .NET 4, тогда получите ItemsPresenter видимость для отслеживания / зависимости от состояния IsExpanded.

В .NET 4.5 добавлено новое свойство VirtualizingPanel.IsVirtualizingWhenGrouping.

Еще одна альтернатива - поместить группу в ViewModel вместо того, чтобы возлагать ответственность за это на DataGrid / CollectionView. Смотрите здесь:

2 голосов
/ 22 августа 2012

Чтобы решить эту проблему, мы сделали следующее.

Мы использовали DataTemplates для представления разных представлений строк для разных моделей представления строк. У нас были GroupRowViewModel и ItemRowViewModel. Также родительская ViewModel, у которой был отсортированный список групповых / видовых моделей.

Когда создавалась сетка, родительская ViewModel сортировала все дочерние модели представления в следующее:

  • Группа
    • Пункт
    • Элемент
    • Элемент
  • Группа
    • Элемент
    • Пункт
    • Пункт

При щелчке по GroupRow вы хотите выполнить некоторый код, в котором родительский элемент (который содержит отсортированный список строк группы + элементов) удалит или включит элементы. Например. скажем, вторая группа была нажата, ваш список моделей строк, с которыми вы сейчас связываете, становится

  • Группа
    • Пункт
    • Элемент
    • Элемент
  • Группа (Свернутая)

Вот и все. Так что никакой магии нет, вы вручную удаляете или включаете нужные вам строки в зависимости от того, на что нажали. Он работал с виртуализацией и сотнями тысяч строк с приемлемой скоростью.

Извините, я не могу опубликовать код (из-за NDA), но я надеюсь, что это поможет вам. Также - я бы посоветовал взглянуть на Telerik Grid, так как это очень быстро для больших наборов данных

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...