我有一个(非虚拟化)ItemsControl,它将其 ItemsSource 绑定到 ViewModel 实例的 ObeservableCollection。现在,一旦加载大量 Model 实例,所有 ViewModel 补充都需要添加到该 ObservableCollection 中。如何添加大量 ViewModel 而不会导致 UI 线程挂起?
我想 UI 线程会挂起,因为每次添加新项目时,ItemsControl 都需要更新自身并一遍又一遍地进行布局等。
- 我是否应该暂停绑定添加所有
项目然后恢复?如果是这样,怎么办?
- 我应该覆盖
ObservableCollection 来实现
AddRange 所以只有 1 个 CollectionChanged
添加多个时会触发事件
项目?或者只是替换
整个集合?
- 或者更好
分别添加每个项目并调用
Dispatcher.Invoke 每个项目
分别地?所以我会解锁
频繁地。
如何处理无法虚拟化的大型动态列表?
您可以创建一个派生类可观察集合这允许您暂时暂停收藏已更改像这样的事件:
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);
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)