ObservableCollection とバッチ変更
C# では、ObservableCollection<T>
クラスは、コレクション項目への変更を追跡し、変更が発生したことをオブザーバーに通知する方法を提供します。ただし、このクラスは AddRange
メソッドをサポートしていません。
この問題を解決するには、一度に複数の項目の追加をサポートする独自の ObservableRangeCollection
クラスを実装できます。 C# 7 で更新され最適化されたバージョンは次のとおりです:
<code class="language-csharp">using System; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Collections.Specialized; public class ObservableRangeCollection<T> : ObservableCollection<T> { public void AddRange(IEnumerable<T> collection) { if (collection == null) throw new ArgumentNullException(nameof(collection)); foreach (var item in collection) Items.Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void RemoveRange(IEnumerable<T> collection) { if (collection == null) throw new ArgumentNullException(nameof(collection)); foreach (var item in collection) Items.Remove(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } public void Replace(T item) { ReplaceRange(new[] { item }); } public void ReplaceRange(IEnumerable<T> collection) { if (collection == null) throw new ArgumentNullException(nameof(collection)); Items.Clear(); foreach (var item in collection) Items.Add(item); OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset)); } }</code>
この実装により、1 回の操作で複数の項目をコレクションに追加または削除でき、OnCollectionChanged
イベントを介して変更をオブザーバーに通知します。
コレクションの変更の処理
コレクションの変更を発生前に処理したい場合 (確認ダイアログを表示するなど)、INotifyCollectionChanging
インターフェイスを実装できます。
<code class="language-csharp">public interface INotifyCollectionChanging<T> { event NotifyCollectionChangingEventHandler<T> CollectionChanging; }</code>
<code class="language-csharp">public class ObservableRangeCollection<T> : ObservableCollection<T>, INotifyCollectionChanging<T> { // ... protected override void ClearItems() { var e = new NotifyCollectionChangingEventArgs<T>(NotifyCollectionChangedAction.Reset, Items); OnCollectionChanging(e); if (e.Cancel) return; base.ClearItems(); } // ... public event NotifyCollectionChangingEventHandler<T> CollectionChanging; protected virtual void OnCollectionChanging(NotifyCollectionChangingEventArgs<T> e) { CollectionChanging?.Invoke(this, e); } }</code>
これにより、CollectionChanging
イベントを処理して、コレクションの変更操作をキャンセルまたは変更できます。
以上がC# で ObservableCollection に項目範囲を効率的に追加および削除するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。