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 ReadOnlyObservableCollectionkoleksi internal dipaksa untuk diturunkan dari ObservableCollectionoleh konstruktor ReadOnlyObservableCollection.
Sekarang misalkan Anda ingin memberi tahu konsumen tentang layanan saat koleksi internal berubah (dan karenanya saat terekspos ReadOnlyObservableCollectionberubah). Daripada menjalankan implementasi Anda sendiri, Anda hanya ingin mengekspos CollectionChangedfile ReadOnlyObservableCollection. Daripada memaksa konsumen untuk membuat asumsi tentang implementasi ReadOnlyObservableCollection, Anda cukup menukar ReadOnlyObservableCollectiondengan kebiasaan ini ObservableReadOnlyCollection, dan selesai.
The ObservableReadOnlyCollectionmenyembunyikan ReadOnlyObservableCollection.CollectionChangeddengan itu sendiri, dan hanya melewati semua peristiwa berubah koleksi untuk setiap event terlampir.