ObservableCollection dan pengubahsuaian kelompok
Dalam C#, kelas ObservableCollection<T>
menyediakan cara untuk menjejaki perubahan pada item koleksi dan memberitahu pemerhati bahawa perubahan berlaku. Walau bagaimanapun, kelas ini tidak menyokong kaedah AddRange
.
Untuk menyelesaikan masalah ini, anda boleh melaksanakan kelas ObservableRangeCollection
anda sendiri, yang menyokong penambahan berbilang item sekaligus. Berikut ialah versi yang dikemas kini dan dioptimumkan dalam 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>
Pelaksanaan ini membolehkan anda menambah atau mengalih keluar berbilang item pada koleksi dalam satu operasi, dan ia akan memberitahu pemerhati tentang perubahan melalui acara OnCollectionChanged
.
Mengendalikan pengubahsuaian koleksi
Jika anda ingin mengendalikan pengubahsuaian koleksi sebelum ia berlaku (contohnya, tunjukkan dialog pengesahan), anda boleh melaksanakan INotifyCollectionChanging
antara muka:
<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>
Dengan cara ini anda boleh mengendalikan acara CollectionChanging
untuk membatalkan atau mengubah suai operasi pengubahsuaian koleksi.
Atas ialah kandungan terperinci Bagaimanakah Saya Boleh Menambah dan Mengalih Keluar Julat Item dengan Cekap daripada ObservableCollection dalam C#?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!