ItemsControl.ItemsSource MVVM性能

bit*_*onk 5 performance itemscontrol mvvm itemssource

我有一个(非虚拟化的)ItemsControl,它将ItemsSource绑定到ViewModel实例的ObeservableCollection.现在,一旦加载了大量的Model实例,就需要将所有ViewModel补充添加到该ObservableCollection中.如何在不使UI线程挂起的情况下添加大量ViewModel?

我想UI线程会挂起,因为每次添加新项目时,ItemsControl都需要自我更新并一遍又一遍地进行布局等.

  • 我应该暂停绑定添加所有项目,然后恢复?如果是这样,怎么样?
  • 我应该覆盖ObservableCollection以实现AddRange,因此只添加1个CollectionChanged事件来添加多个项目吗?或者只是替换整个系列?
  • 或者分别添加每个项目并分别为每个项目调用Dispatcher.Invoke更好?所以我会经常解锁.

如何处理无法虚拟化的大型动态列表?

Wim*_*nen 10

您可以创建一个从ObservableCollection派生的类,它允许您暂时挂起CollectionChanged事件,如下所示:

public class SuspendableObservableCollection : ObservableCollection
{
    private bool suspended;

    public bool Suspended 
    {
        get
        {
            return this.suspended;
        }
        set
        {
            this.suspended = value;
            OnCollectionChanged(new NotifyCollectionChangedEventArgs(
                NotifyCollectionChangedAction.Reset));
        }
    }

    protected override void OnCollectionChanged(
        NotifyCollectionChangedEventArgs args)
    {
       if (!Suspended)
       {
           base.OnCollectionChanged(args);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)