6

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

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

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

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

4

2 回答 2

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);
       }
    }
}
于 2010-03-17T11:54:16.857 回答
0
<ItemsControl IsAsync="True" ... />
于 2010-10-06T18:33:14.440 回答