DataGrid with Groups and VirtualizingPanel.IsVirtualizingWhe

本文关键字:VirtualizingPanel IsVirtualizingWhe and Groups with DataGrid | 更新日期: 2023-09-27 18:36:47

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

这是代码的一部分:

在视图中模型:

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" 时,加载非常(非常)慢,但至少,组的行为是正常的,这意味着我可以折叠第一个组,我可以看到下面第二个。

DataGrid with Groups and VirtualizingPanel.IsVirtualizingWhe

也许有点晚了,但可以提供帮助。我们刚刚遇到了这个问题,并发现应该出现的组中的 DataGridRowsPresenter 保持其可见性 = 折叠。因此,组本身的实际高度为 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这个"黑客"作为在虚拟化、分组和滚动查看器交互中可能被忽略的提示。

相关文章:
  • 没有找到相关文章