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中文网其他相关文章!