Это не столько вопрос, сколько еще что-то, что поразило меня как нечетное: класс ObservableCollection
является общим, но событие CollectionChanged
, которое оно вызывает при изменении коллекции, не является. Это означает, что в обработчике событий вы должны отбросить все объекты в коллекциях /OldItems
, которые вы получаете от объекта args события, к собственному типу элемента.C#: ObservableCollection - почему нет общего события «CollectionChanged»?
Но разве просто невозможно было сделать это событие общим? Что-то вроде
public virtual event NotifyCollectionChangedEventHandler<T> CollectionChanged;
с
public delegate void NotifyCollectionChangedEventHandler(object sender, NotifyCollectionChangedEventArgs<T> e);
, а затем
public class NotifyCollectionChangedEventArgs<T> {
// ...
public IList<T> NewItems { get; }
public IList<T> OldItems { get; }
В конце концов, параметр типа T
уже определяется декларацией ObservableCollection
в вопросе, что означает, что вы никогда не должны иметь возможность добавлять в коллекцию любые объекты, которые не имеют типа T
(или совместимы с ним). Таким образом, все это должно быть совершенно безопасным для типов и избавить нас от необходимости бросать объекты внутри обработчика событий в любой тип, который, как мы знаем, должен иметь в любом случае.
Есть ли причина не делать это таким образом, что мне не хватает? То есть это сознательное дизайнерское настроение или просто недосмотр?
Если я правильно помню (но я очень хорошо мог ошибаться), это как-то связано с WPF, который не мог работать с дженериками, но должен был знать, как слушать изменения коллекции (ObservableCollection вводится ради WPF в основном, так что это имеет смысл) – Polity