数据网格分组带来了更好的性能

本文关键字:来了 更好 性能 数据网 网格 数据 | 更新日期: 2023-09-27 17:50:14

我有一个DataGrid,我正在使用一个ICollectionView来分组大型集合中的项目,在某些情况下有20k+行。我以前使用过这种方法,在显示所有行或虚拟化以创建响应性更好的页面方面取得了不同程度的成功。在这种情况下,我希望尽可能多地虚拟化,以保持UI响应。我用这个答案中的技巧来解决我的问题,但收效甚微。有用的DataGrid Link

我的主要问题是当将数据加载到ICollectionView View/Source中时,DataGrid上有几秒钟的延迟,我希望通过适当的虚拟化来最小化。下面是我的一些代码:

<DataGrid Margin="0,2,0,0" IsReadOnly="True" ItemsSource="{Binding DataView,IsAsync =True}" EnableRowVirtualization ="True" MaxWidth="2560" MaxHeight="1600"
              Grid.Row="2" SelectionMode="Extended" VirtualizingPanel.IsVirtualizingWhenGrouping="True" SelectionUnit="FullRow" SelectedItem="{Binding SelectedOutage}">
    <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True" Foreground="{StaticResource Foreground}" Background="{StaticResource AlternatingBackground}">
                                        <Expander.Header>
                                            <TextBlock Text="{Binding Name}" Margin="5,0,0,0" Width="300"/>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
        <!--Follows are DataGrid.ContextMenu and DataGridTextColumns with fixed widths-->
</DataGrid>

和c#项目:

public ICollectionView DataView { get; set; }
private readonly ObservableCollection<EquipmentMonitorRow> equipment = new ObservableCollection<EquipmentMonitorRow>();
DataView = CollectionViewSource.GetDefaultView(equipment);
DataView.GroupDescriptions.Add(new PropertyGroupDescription("GroupName"));
equipment.Clear();
//Lag is during this item adding.
equipment.AddRange(data);

所以我希望我错过了一些虚拟化或者也许我可以添加不同的项目或其他东西。任何帮助都会很感激。谢谢。

数据网格分组带来了更好的性能

将ObservableCollection源更改为List源解决了初始加载延迟

private readonly List<EquipmentMonitorRow> equipment = new List<EquipmentMonitorRow>();

同样使用VirtualizingPanel属性的组合,我实现了最好的虚拟化。特别是如果我省略了VirtualizingPanel。IsVirtualizingWhenGrouping="True"则应用程序延迟了近一分钟才在我的DataGrid中显示任何内容。在没有虚拟化的情况下,滚动要好得多,但在我的情况下,初始负载是不可接受的。

VirtualizingPanel.IsVirtualizingWhenGrouping="True" VirtualizingPanel.ScrollUnit ="Item" VirtualizingPanel.VirtualizationMode="Recycling"

谢谢你的帮助

Datagrid默认支持UI虚拟化,但一旦在ICollectionView上应用分组,UI虚拟化将被关闭

你可以参考MSDN样本,它基本上扁平化了支持虚拟化的分组列表。


更新注释:

这没有特别提到一个集合视图,但似乎有虚拟化

从链接:

在一个正常的WPF中,ItemsControl被虚拟化,比如ListBox或者在ListView中,当您打开分组时,虚拟化将关闭。

DataGrid只从ItemsControl派生,因此UI虚拟化在分组时是关闭的。