C#:ObservableCollection-为什么没有通用的“;CollectionChanged”;事件
本文关键字:CollectionChanged 事件 ObservableCollection- 为什么 | 更新日期: 2023-09-27 18:25:22
这与其说是一个问题,更让我感到奇怪的是:ObservableCollection
类是泛型的,但它在更改为集合时引发的CollectionChanged
事件不是。这意味着在事件处理程序中,您必须将从事件args对象获得的NewItems
/OldItems
集合中的所有对象强制转换为正确的项类型。
但是,难道不应该简单地使该事件具有通用性吗?类似的东西
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
类型(或与之兼容)的对象。因此,所有这些都应该是完全类型安全的,并为我们省去了将事件处理程序中的对象强制转换为我们知道它们应该具有的任何类型的麻烦。
有没有理由不这样做,因为我错过了?也就是说,这是一个有意识的设计要求,还是只是一个疏忽?
INotifyCollectionChanged
接口和INotifyPropertyChanged
是专为WPF框架使用而设计的。由于WPF是松散类型的,我猜泛型不是设计的一部分。我不认为INotifyCollectionChanged
是直接消费的。然而,ObservableCollection<T>
被设计为被强类型的C#代码消耗,因此泛型在设计中具有特色。