Heim >Backend-Entwicklung >C++ >Wie kann ich in C# effizient Elementbereiche zu einer ObservableCollection hinzufügen und daraus entfernen?
ObservableCollection und Batch-Änderung
In C# bietet die Klasse ObservableCollection<T>
eine Möglichkeit, Änderungen an Sammlungselementen zu verfolgen und Beobachter über auftretende Änderungen zu benachrichtigen. Diese Klasse unterstützt jedoch nicht die Methode AddRange
.
Um dieses Problem zu lösen, können Sie Ihre eigene ObservableRangeCollection
-Klasse implementieren, die das gleichzeitige Hinzufügen mehrerer Elemente unterstützt. Hier ist die aktualisierte und optimierte Version in 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>
Mit dieser Implementierung können Sie in einem Vorgang mehrere Elemente zu einer Sammlung hinzufügen oder entfernen und Beobachter werden über OnCollectionChanged
Ereignisse über die Änderungen benachrichtigt.
Umgang mit Sammlungsänderungen
Wenn Sie Sammlungsänderungen verarbeiten möchten, bevor sie auftreten (z. B. einen Bestätigungsdialog anzeigen), können Sie die INotifyCollectionChanging
Schnittstelle implementieren:
<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>
Auf diese Weise können Sie das CollectionChanging
-Ereignis verarbeiten, um den Sammlungsänderungsvorgang abzubrechen oder zu ändern.
Das obige ist der detaillierte Inhalt vonWie kann ich in C# effizient Elementbereiche zu einer ObservableCollection hinzufügen und daraus entfernen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!