0

我在 Silverlight 中从事一个项目,我想知道 ObservableCollection 是如何工作的。在 Reflector 中看到这一点,我感到非常惊讶:

public class ObservableCollection<T> :
             Collection<T>, INotifyCollectionChanged, INotifyPropertyChanged
{
    // Fields
    private bool _busy;

    // Events
    public event NotifyCollectionChangedEventHandler CollectionChanged;

    protected event PropertyChangedEventHandler PropertyChanged;

    event PropertyChangedEventHandler INotifyPropertyChanged.PropertyChanged;
...

它怎么会有 2 个具有相同名称和类型的事件?这是怎么回事?这是反射器中的错误吗?

4

2 回答 2

2

不,这是显式接口实现。这一行:

protected event PropertyChangedEventHandler PropertyChanged;

无法实现 INotifyPropertyChanged 合同,因为它不是公开的。其他类不能引用它,因此 ObservableCollection 不像它的客户那样看它实现了它所说的接口。例如

ObservableCollection<string> coll;
// ObservableCollection implements INotifyPropertyChanged, so I should be able to...
coll.PropertyChanged += ...
// ... but this wouldn't compile because PropertyChanged is protected

为了解决这个问题,ObservableCollection 添加了 PropertyChanged 的​​另一个实现,它被“限定”到 INotifyPropertyChanged 接口。也就是说,它只有在客户端通过 INotifyPropertyChanged 类型的引用访问 ObservableCollection 时才可用,在这种情况下它实际上是公共的。所以现在想要使用 ObservableCollection 实现 INotifyPropertyChanged 的​​客户会很高兴,因为他们正在寻找的事件就在那里:

INotifyPropertyChanged notifier = coll;
notifier.PropertyChanged += ...  // compiles (using explicit implementation)

但是添加的 PropertyChanged 不会与同名的受保护成员冲突,因为它的范围是该INotifyPropertyChanged.前缀。

于 2009-12-20T21:21:53.807 回答
0

它被称为显式声明。这与泛型集合可以具有两个 GetEnumerator() 方法的方式相同。一个被宣布为公开的;另一个被声明为显式。

于 2009-12-20T21:17:11.197 回答