WPF DataGrid一直重新渲染

时间:2018-02-07 09:52:26

标签: c# wpf performance datagrid observablecollection

我正在向另一个进程绑定到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可能不会重新绘制所有内容(由于虚拟化,它/被认为是不可见的而不是“绘制”的)?

0 个答案:

没有答案