【问题标题】:C#: ObservableCollection - why no generic "CollectionChanged" event?C#:ObservableCollection - 为什么没有通用的“CollectionChanged”事件?
【发布时间】:2012-03-11 19:13:38
【问题描述】:

这不是一个问题,更让我感到奇怪的是: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 类型的对象(或与其兼容) ) 无论如何都要收藏。所以所有这些都应该是完全类型安全的,并且省去了我们必须将事件处理程序中的对象转换为我们知道它们应该具有的任何类型的麻烦。

我是否有理由不这样做? IE。这是一个有意识的设计决定,还是只是一个疏忽?

【问题讨论】:

  • 如果我没记错的话(但我很可能是错的)这与 WPF 有关,它无法使用泛型但需要知道如何监听集合更改(引入了 ObservableCollection为了 WPF,基本上这是有道理的)

标签: c# events generics language-design


【解决方案1】:

INotifyCollectionChanged 接口以及INotifyPropertyChanged 专为 WPF 框架使用而设计。由于 WPF 是松散类型的,我猜泛型不是该设计的一部分。我不认为INotifyCollectionChanged 被设计为直接消费。而ObservableCollection&lt;T&gt; 旨在供 C# 代码使用,它是强类型的,因此设计中包含泛型。

【讨论】:

  • INotifyPropertyChanged 是在 .NET 2.0 中引入的,因此它肯定不是专门为 WPF 设计的。
  • INotiftPropertyChanged 是与 IErrorInfo 一起引入的,用于原始 Windows 窗体中的数据绑定。绑定源仅处理“对象”类型。
  • ObservableCollection 实现了 INotifyCollectionChanged 和 INotifyPropertyChanged,
猜你喜欢
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 2016-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多