ItemsControl.ItemsSource MVVM性能

时间:2010-03-17 07:44:27

标签: performance mvvm itemscontrol itemssource

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

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

  • 我应该暂停绑定添加全部 项目,然后恢复?如果是这样,怎么样?
  • 我应该覆盖 ObservableCollection实现了 AddRange只有1个CollectionChanged 添加多个事件被触发 项目?或者只是替换 整个系列?
  • 或者它更好 分别添加每个项目并致电 Dispatcher.Invoke为每个项目 分别?所以我会解锁 频繁。

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

2 个答案:

答案 0 :(得分: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);
       }
    }
}

答案 1 :(得分:0)

<ItemsControl IsAsync="True" ... />