我有一个DataGrid,我使用ICollectionView对大型集合中的项目进行分组,在某些情况下为20k +行。我之前使用过这种方法,在显示所有行或虚拟化以创建更具响应性的页面方面取得了不同的成功。在这种情况下,我希望尽可能虚拟化以保持UI响应。我已经使用了这个答案中的提示而我的问题收效甚微。 Helpful 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);
所以希望我错过了一些虚拟化,或者我可以用不同的方式添加项目。 任何帮助,将不胜感激。感谢。
答案 0 :(得分:1)
默认情况下,Datagrid支持UI虚拟化,但只要您在ICollectionView上应用分组,就会关闭UI虚拟化。
您可以参考 MSDN sample ,这基本上会使支持虚拟化的分组列表变得扁平化。
更新评论:
这没有具体提到收藏视图,但似乎有 虚拟化
从链接:
在虚拟化的普通WPF ItemsControl中,例如ListBox或 ListView,虚拟化在您开启分组时关闭。
DataGrid仅来自ItemsControl,因此在分组时关闭UI虚拟化。
答案 1 :(得分:1)
将我的ObservableCollection源更改为List源解决了初始加载延迟。
private readonly List<EquipmentMonitorRow> equipment = new List<EquipmentMonitorRow>();
同时使用VirtualizingPanel属性的组合,我实现了最佳的虚拟化。具体来说,如果我省略了VirtualizingPanel.IsVirtualizingWhenGrouping =“True”,那么应用程序会在我的DataGrid中显示任何内容之前滞后差不多一分钟。没有虚拟化,滚动效果要好得多,但在我的情况下初始加载是不可接受的。
VirtualizingPanel.IsVirtualizingWhenGrouping="True" VirtualizingPanel.ScrollUnit ="Item" VirtualizingPanel.VirtualizationMode="Recycling"
感谢您的帮助。