我正在向另一个进程绑定到DataGrid的ObservableCollection添加多个元素。我试图逐个添加元素,并使用自定义ObservableCollection来添加这样的范围:
public void AddRange(IEnumerable<T> range)
{
foreach (var item in range)
this.Items.Add(item);
this.OnPropertyChanged(new PropertyChangedEventArgs("Count"));
this.OnPropertyChanged(new PropertyChangedEventArgs("Item[]"));
this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
使用AddRange方法,UI会冻结很多(在添加项目时它完全无法使用),可能是因为重置事件。使用WPF性能分析工具我看到DataGrid始终完全重新绘制,即使使用虚拟化也是如此。我在DataGrid中使用以下代码来激活虚拟化:
VirtualizingStackPanel.IsVirtualizing="True"
VirtualizingStackPanel.IsVirtualizingWhenGrouping="True"
VirtualizingStackPanel.ScrollUnit="Pixel"
VirtualizingStackPanel.VirtualizationMode="Recycling"
尝试使用普通的ObservableCollection并逐个添加更好但仍然重新绘制每个项目,即使它不可见且仍然很慢,帧速率减半。
是否有一些我缺少的东西可以让表现更好?添加item / s时,DataGrid可能不会重新绘制所有内容(由于虚拟化,它/被认为是不可见的而不是“绘制”的)?