Решение
ReadOnlyObservableCollection.CollectionChanged
не отображается (по уважительным причинам, изложенным в других ответах), поэтому давайте создадим наш собственный класс-оболочку, который его предоставляет:
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);
}
Объяснение
Люди спрашивают, почему вы хотели бы наблюдать изменения в коллекции, доступной только для чтения, поэтому я объясню одну из многих возможных ситуаций; когда коллекция, доступная только для чтения, является оболочкой для частной внутренней коллекции, которая может изменяться.
Вот один из таких сценариев:
Предположим, у вас есть служба, которая позволяет добавлять элементы во внутреннюю коллекцию и удалять их извне. Теперь предположим, что вы хотите раскрыть значения коллекции, но не хотите, чтобы потребители напрямую манипулировали коллекцией; поэтому вы оборачиваете внутреннюю коллекцию в ReadOnlyObservableCollection
.
Обратите внимание, что для того, чтобы обернуть внутреннюю коллекцию ReadOnlyObservableCollection
внутренней коллекцией, ObservableCollection
конструктор ReadOnlyObservableCollection
.
Теперь предположим, что вы хотите уведомить потребителей службы об изменении внутренней коллекции (и, следовательно, о выставленных ReadOnlyObservableCollection
изменениях). Вместо того , чтобы качению своей собственной реализации , вы просто хотите , чтобы разоблачить CollectionChanged
из ReadOnlyObservableCollection
. Вместо того, чтобы заставлять потребителя делать предположения о реализации ReadOnlyObservableCollection
, вы просто меняете местами ReadOnlyObservableCollection
этот обычай ObservableReadOnlyCollection
, и все готово.
Он ObservableReadOnlyCollection
скрывается ReadOnlyObservableCollection.CollectionChanged
со своим собственным и просто передает все события изменения коллекции любому присоединенному обработчику событий.