为什么INotifyCollectionChanged不是泛型的?

4
如果我创建一个新的ObservableCollection<T>,并添加如下CollectionChanged监听器:
var c = new ObservableCollection<MyType>();
c.CollectionChanged += new NotifyCollectionChangedEventHandler(h);
...
void h(object sender, NotifyCollectionChangedEventArgs e) 
{
    IList newItems = e.NewItems;
    // non generic IList!  :(
}

为什么e.NewItems不是IList<MyType>
2个回答

5
ObservableCollection旨在支持数据绑定场景,例如WPF平台中的数据绑定控件不关心它们绑定到的集合类型。如果通知是通用的,那么编写控件将变得更加困难,而没有任何好处。

嗯。这似乎表明,如果我需要手动编写自己的NotifyCollectionChangedEventHandler,那么我就做错了™。 - funkybro
不,我不会说你做错了;只是成本效益分析不支持拥有通用版本。创建自己的处理程序是完全有效的事情,但很少见,因此在平台上为通用版本添加特殊支持是不值得的。 - Gabe
1
只需在“NewItems”属性上放置“.Cast<T>()”或“.OfType<T>()”,即可获得您的泛型列表,因此我绝对会说,编写自己的代码是不值得的。 - Steve Greatrex
是的,在我的应用程序中有一个相当复杂的视图模型... 我的 VM 是一个类(实现了 INotifyPropertyChanged),包含一个“子”VMs 的 ObservableCollection,每个子 VM 也实现了 INotifyPropertyChanged。我需要监听集合中任何项的更改,以触发基类中属性的 PropertyChanged。也许这需要自己的问题! - funkybro

1

可能是为了使其可用于非泛型集合以及 ObservableCollection<T>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接