在过去的几年里,我使用了一个更通用的解决方案来消除过多的 ObservableCollection 通知,方法是创建一个批量更改操作并使用重置操作通知观察者:
public class ExtendedObservableCollection<T>: ObservableCollection<T>
{
public ExtendedObservableCollection()
{
}
public ExtendedObservableCollection(IEnumerable<T> items)
: base(items)
{
}
public void Execute(Action<IList<T>> itemsAction)
{
itemsAction(Items);
OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}
}
使用它很简单:
var collection = new ExtendedObservableCollection<string>(new[]
{
"Test",
"Items",
"Here"
});
collection.Execute(items => {
items.RemoveAt(1);
items.Insert(1, "Elements");
items.Add("and there");
});
调用 Execute 将生成单个通知,但有一个缺点 - 列表将在整个 UI 中更新,而不仅仅是修改的元素。这使其非常适合 items.Clear() 后跟 items.AddRange(newItems)。