DataGrid with Groups and VirtualizingPanel.IsVirtualizingWhenGrouping =" True"

时间:2015-01-08 11:00:59

标签: c# wpf datagrid virtualization groupstyle

我遇到了一个具有GroupDescription的DataGrid的奇怪行为,并且选项VirtualizingPanel.IsVirtualizingWhenGrouping =" True"在xaml。

以下是代码的一部分:

在ViewModel中:

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 =&#34; True&#34;时,加载非常(非常)缓慢,但至少,组的行为是正常的,这意味着我可以崩溃第一组,我可以看到下面的第二组。

1 个答案:

答案 0 :(得分:0)

也许有点晚,但是可以帮上忙。我们刚遇到这个问题,发现应该出现的组中的 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的错误,并带有此“ hack”,以暗示在虚拟化,分组和滚动查看器交互中可能被忽略的内容。