Maison >développement back-end >C++ >Comment puis-je ajouter et supprimer efficacement des plages d'éléments d'une ObservableCollection en C# ?
ObservableCollection et modification par lots
En C#, la classe ObservableCollection<T>
fournit un moyen de suivre les modifications apportées aux éléments de collection et d'informer les observateurs que des modifications se produisent. Cependant, cette classe ne prend pas en charge la méthode AddRange
.
Pour résoudre ce problème, vous pouvez implémenter votre propre ObservableRangeCollection
classe, qui prend en charge l'ajout de plusieurs éléments à la fois. Voici la version mise à jour et optimisée en 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>
Cette implémentation vous permet d'ajouter ou de supprimer plusieurs éléments à une collection en une seule opération, et elle informera les observateurs des changements via des OnCollectionChanged
événements.
Gestion des modifications de collection
Si vous souhaitez gérer les modifications de la collection avant qu'elles ne se produisent (par exemple, afficher une boîte de dialogue de confirmation), vous pouvez implémenter l'INotifyCollectionChanging
interface :
<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>
Vous pouvez ainsi gérer l'événement CollectionChanging
pour annuler ou modifier l'opération de modification de la collection.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!