2012-02-21 97 views
2

这不是一个问题,更多的东西让我觉得奇怪:ObservableCollection类是通用的,但是在更改为集合时引发的CollectionChanged事件不是。这意味着在事件处理程序中,您必须将您从事件参数对象获得的集合中的所有对象都转换为适当的项目类型。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(或兼容)的对象添加到集合中。因此,所有这些应该是完全类型安全的,并且节省我们不得不将事件处理程序内的对象转换为我们知道它们应该拥有的任何类型的麻烦。

有没有理由不这样做,我失踪了?即这是一个有意识的设计desicion,或者只是一个疏忽?

+1

如果我记得没错(但我很可能是错的),这与WPF有关,它无法使用泛型,但需要知道如何听集合更改(ObservableCollection是为了WPF而引入的基本上这是有道理的) – Polity 2012-02-21 13:19:43

回答

-1

INotifyCollectionChanged接口以及INotifyPropertyChanged专门设计用于WPF框架。由于WPF是松散类型的,我猜测泛型不是该设计的一部分。我不认为INotifyCollectionChanged被设计为直接消耗。然而,ObservableCollection<T>被设计为被C#代码占用,而C#代码是强类型的,因此设计中使用了泛型。

+4

'INotifyPropertyChanged'在.NET 2.0中引入,所以它绝对不是专门为WPF设计的。 – Lukazoid 2012-02-21 13:24:44

+0

INotiftPropertyChanged与IErrorInfo一起引入,用于原始窗体中的数据绑定。绑定源仅处理“对象”类型。 – 2012-02-21 13:41:28

相关问题