2012-02-21 2 views
2

Это не столько вопрос, сколько еще что-то, что поразило меня как нечетное: класс 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 (или совместимы с ним). Таким образом, все это должно быть совершенно безопасным для типов и избавить нас от необходимости бросать объекты внутри обработчика событий в любой тип, который, как мы знаем, должен иметь в любом случае.

Есть ли причина не делать это таким образом, что мне не хватает? То есть это сознательное дизайнерское настроение или просто недосмотр?

+1

Если я правильно помню (но я очень хорошо мог ошибаться), это как-то связано с WPF, который не мог работать с дженериками, но должен был знать, как слушать изменения коллекции (ObservableCollection вводится ради WPF в основном, так что это имеет смысл) – Polity

ответ

-1

Интерфейс INotifyCollectionChanged, а также INotifyPropertyChanged, были разработаны исключительно для использования в рамках WPF. Поскольку WPF свободно набирается, я предполагаю, что дженерики не являются частью этого проекта. Я не думаю, что INotifyCollectionChanged был предназначен для потребления напрямую. Принимая во внимание, что ObservableCollection<T> предназначен для использования кодом C#, который строго типизирован, поэтому в дизайне представлены дженерики.

+4

'INotifyPropertyChanged' был представлен в .NET 2.0, поэтому он определенно не был разработан исключительно для WPF. – Lukazoid

+0

INotiftPropertyChanged был введен вместе с IErrorInfo для привязки данных в оригинальных формах окон. Источник привязки относится только к типу «Объект». –

Смежные вопросы