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>
此實作可讓您在一個操作中向集合新增或刪除多個項目,並且它將透過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中文網其他相關文章!