Larutan
ReadOnlyObservableCollection.CollectionChanged
tidak terekspos (untuk alasan valid yang diuraikan dalam jawaban lain), jadi mari buat kelas pembungkus kita sendiri yang memaparkannya:
public class ObservableReadOnlyCollection<T> : ReadOnlyObservableCollection<T>
{
public new NotifyCollectionChangedEventHandler CollectionChanged;
public ObservableReadOnlyCollection(ObservableCollection<T> list) : base(list) { }
protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs args) =>
CollectionChanged?.Invoke(this, args);
}
Penjelasan
Orang-orang bertanya mengapa Anda ingin mengamati perubahan pada koleksi hanya-baca, jadi saya akan menjelaskan salah satu dari banyak situasi yang valid; saat koleksi hanya-baca membungkus koleksi internal pribadi yang bisa berubah.
Inilah salah satu skenario tersebut:
Misalkan Anda memiliki layanan yang memungkinkan penambahan dan penghapusan item ke koleksi internal dari luar layanan. Sekarang misalnya Anda ingin mengekspos nilai-nilai koleksi tetapi Anda tidak ingin konsumen memanipulasi koleksi secara langsung; jadi Anda membungkus koleksi internal dalam file ReadOnlyObservableCollection
.
Perhatikan bahwa untuk membungkus koleksi internal dengan ReadOnlyObservableCollection
koleksi internal dipaksa untuk diturunkan dari ObservableCollection
oleh konstruktor ReadOnlyObservableCollection
.
Sekarang misalkan Anda ingin memberi tahu konsumen tentang layanan saat koleksi internal berubah (dan karenanya saat terekspos ReadOnlyObservableCollection
berubah). Daripada menjalankan implementasi Anda sendiri, Anda hanya ingin mengekspos CollectionChanged
file ReadOnlyObservableCollection
. Daripada memaksa konsumen untuk membuat asumsi tentang implementasi ReadOnlyObservableCollection
, Anda cukup menukar ReadOnlyObservableCollection
dengan kebiasaan ini ObservableReadOnlyCollection
, dan selesai.
The ObservableReadOnlyCollection
menyembunyikan ReadOnlyObservableCollection.CollectionChanged
dengan itu sendiri, dan hanya melewati semua peristiwa berubah koleksi untuk setiap event terlampir.