Çözüm
ReadOnlyObservableCollection.CollectionChanged açığa çıkmaz (diğer yanıtlarda belirtilen geçerli nedenlerden dolayı), öyleyse onu açığa çıkaran kendi sarmalayıcı sınıfımızı yapalım:
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);
}
Açıklama
İnsanlar salt okunur bir koleksiyondaki değişiklikleri neden gözlemlemek istediğinizi sordular, bu yüzden birçok geçerli durumdan birini açıklayacağım; salt okunur koleksiyon, değişebilen özel bir dahili koleksiyonu sarmaladığında.
İşte böyle bir senaryo:
Hizmetin dışından bir iç koleksiyona öğe eklemeye ve kaldırmaya izin veren bir hizmetiniz olduğunu varsayalım. Şimdi, koleksiyonun değerlerini ortaya çıkarmak istediğinizi, ancak tüketicilerin koleksiyonu doğrudan değiştirmesini istemediğinizi varsayalım; böylece iç koleksiyonu bir ReadOnlyObservableCollection.
Dahili koleksiyonu iç koleksiyonla sarmak için , yapıcısı tarafından ReadOnlyObservableCollectiontüretilmeye zorlanır .ObservableCollectionReadOnlyObservableCollection
Şimdi, dahili koleksiyon değiştiğinde (ve dolayısıyla maruz kalan ReadOnlyObservableCollectiondeğişiklik olduğunda ) tüketicileri hizmet hakkında bilgilendirmek istediğinizi varsayalım . Kendi uygulamanızı devirmek yerine CollectionChanged, yalnızca ReadOnlyObservableCollection. Tüketiciyi ürünün uygulanması hakkında bir varsayım yapmaya zorlamak yerine ReadOnlyObservableCollection, sadece ReadOnlyObservableCollectionbu gelenekle değiştirirsiniz ObservableReadOnlyCollectionve bitirdiniz.
ObservableReadOnlyCollectionGizler ReadOnlyObservableCollection.CollectionChangedonunla kendi var ve sadece herhangi ekli olay işleyicisi için tüm koleksiyon değiştirildi olaylara geçer.