DataGrid с группами и VirtualizingPanel.IsVirtualizingWhenGrouping=True

Я сталкиваюсь со странным поведением с DataGrid, который имеет GroupDescription, и с параметром VirtualizingPanel.IsVirtualizingWhenGrouping="True" в xaml.

Вот часть кода:

В модели представления:

if (collectionView.GroupDescriptions == null) return;
collectionView.GroupDescriptions.Add(new PropertyGroupDescription("Type"));

В XAML

...

<Style x:Key="DataGridGroupHeaderCountStyle" TargetType="{x:Type GroupItem}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupItem}">
                <Expander Background="{Binding Path=Tag,
                                               RelativeSource={RelativeSource Mode=FindAncestor,
                                                                              AncestorType=DataGrid}}"
                          BorderBrush="{Binding Path=Tag,
                                                RelativeSource={RelativeSource Mode=FindAncestor,
                                                                               AncestorType=DataGrid}}"
                          Foreground="{Binding Path=Tag,
                                               RelativeSource={RelativeSource Mode=FindAncestor,
                                                                              AncestorType=DataGrid}}"
                          Style="{StaticResource DataGridExpanderGroupStyle}">
                    <Expander.Header>
                        <DockPanel>
                            <TextBlock MinWidth="100"
                                       Margin="5,0,0,0"
                                       HorizontalAlignment="Left"
                                       VerticalAlignment="Center"
                                       Text="{Binding Path=Name}" />
                            <TextBlock HorizontalAlignment="Left"
                                       VerticalAlignment="Center"
                                       Text="{Binding Path=ItemCount}" />
                        </DockPanel>
                    </Expander.Header>
                    <Expander.Content>
                        <ItemsPresenter />
                    </Expander.Content>
                </Expander>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

...

<DataGrid x:Name="MyDataGrid"
                      Grid.Row="1"
                      Grid.Column="0"
                      Grid.ColumnSpan="2"
                      IsReadOnly="True"
                      AutoGenerateColumns="False"
                      CanUserAddRows="False"
                      CanUserDeleteRows="False"
                      CanUserSortColumns="True"
                      EnableRowVirtualization="True"
                      IsSynchronizedWithCurrentItem="True"
                      ItemsSource="{Binding Path=CollectionView,
                                            Mode=OneWay}"
                      ScrollViewer.IsDeferredScrollingEnabled="True"
                      SelectionChanged="MyDataGridOnSelectionChanged"
                      SelectionMode="Extended"
                      SelectorHelper.AutoScrollIntoView="True"
                      Tag="{Binding Path=ColorsTheme.Border}"

                      VirtualizingPanel.IsVirtualizingWhenGrouping="True">

                <DataGrid.GroupStyle>
                    <GroupStyle ContainerStyle="{StaticResource DataGridGroupHeaderCountStyle}">
                        <GroupStyle.Panel>
                            <ItemsPanelTemplate>
                                <DataGridRowsPresenter />
                            </ItemsPanelTemplate>
                        </GroupStyle.Panel>
                    </GroupStyle>
                </DataGrid.GroupStyle>
                <DataGrid.Columns>

Описание проблемы:

Например, у меня есть, скажем, 25 000 строк в сетке данных. Загрузка в порядке с виртуализацией.

Моя проблема заключается в том, что когда я нажимаю на первую (из двух) группу, чтобы свернуть ее: я никогда не вижу вторую группу, она исчезает! Кто-нибудь знает, почему? или это баг?

Когда я не использую VirtualizingPanel.IsVirtualizingWhenGrouping="True", загрузка очень (чрезвычайно) медленная, но, по крайней мере, поведение групп нормальное, это означает, что я могу свернуть первую группу, я вижу второе пришествие ниже.


person alxtr1bal    schedule 08.01.2015    source источник
comment
Попробуйте без настройки панели GroupStyle   -  person dev hedgehog    schedule 08.01.2015
comment
Спасибо ! Я пробовал без него, но это не меняет поведение   -  person alxtr1bal    schedule 08.01.2015
comment
Освободите свой DataGrid от всех этих дополнений, таких как SelectorHelper.AutoScrollIntoView=True и ScrollViewer.IsDeferredScrollingEnabled=True, затем повторите попытку.   -  person dev hedgehog    schedule 08.01.2015
comment
Ну, это какие-то тесты... я пробовал с, без :-) это одно и то же! Я повторил попытку сейчас, просто чтобы быть уверенным, но это не работает... я сворачиваю первую группу и не могу вторую...   -  person alxtr1bal    schedule 08.01.2015
comment
Мне кажется, что scrollviewer все портит. Скорее всего не правильно измеряет. Я только что попробовал небольшой пример с этим ‹DataGrid EnableColumnVirtualization=True EnableRowVirtualization=True VirtualizingPanel.IsVirtualizingWhenGrouping=True›, и он работает для меня. Можете ли вы попробовать еще раз с фиксированными значениями ширины и высоты?   -  person dev hedgehog    schedule 08.01.2015
comment
О, поверь мне, я пытался!! Ничего не работает :( (только что попробовал еще раз). Я думаю, это происходит, когда вторая группа не отображается на экране (я думаю)   -  person alxtr1bal    schedule 08.01.2015
comment
Я нашел это. Прочитайте его, пожалуйста, это может вам помочь. connect.microsoft. com/VisualStudio/feedback/details/765682/ Кажется, это ошибка :))   -  person dev hedgehog    schedule 08.01.2015
comment
Я очень ценю вашу помощь :) Я скачал это исправление, но, к сожалению, не могу его установить .... не подходит для моей системы (8.1, .net 4.5.2). Во всяком случае, свиток не заморожен, просто вторая группа исчезает, когда я сворачиваю первую :)   -  person alxtr1bal    schedule 08.01.2015
comment
Не могли бы вы загрузить свой проект? я тоже хочу протестировать   -  person dev hedgehog    schedule 09.01.2015
comment
Угадайте, что я создал небольшой проект для тестирования, и мне не удалось воспроизвести его в тестовом проекте :(   -  person alxtr1bal    schedule 12.01.2015


Ответы (1)


Может быть, немного поздно, но может помочь. Мы только что столкнулись с этой проблемой и выяснили, что DataGridRowsPresenter в группах, которые должны появиться, сохранили свое Visibility = Collapsed. В результате сама группа будет иметь ActualHeight, равную 0, и не будет отображаться.

Чтобы решить эту проблему, мы взломали (?) в этом определении ItemPanel:

<DataGrid.ItemsPanel>
    <ItemsPanelTemplate>
        <DataGridRowsPresenter IsItemsHost="True" Visibility="{Binding RelativeSource={RelativeSource AncestorType={x:Type Expander}}, Path=IsExpanded, Converter={StaticResource BooleanToVisibilityConverter}}"/>
    </ItemsPanelTemplate>
</DataGrid.ItemsPanel>

В основном обеспечение видимости, если группа была расширена. Это, по-видимому, сохраняет преимущества виртуализации строк при группировании и гарантирует, что группы, которые находились за пределами видимого диапазона, появляются в поле зрения.

Увидев, что у других была такая же проблема, вероятно, они опубликуют это как ошибку в Microsoft с этим «взломом» в качестве намека на то, что может быть упущено из виду при взаимодействии с виртуализацией, группировкой и просмотром прокрутки.

person knilch    schedule 05.03.2020