過去数年間、私はより一般的なソリューションを使用して、バッチ変更操作を作成し、リセット アクションでオブザーバーに通知することで、あまりにも多くの 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) が続く場合に最適です。