ObservableDictionary事件提升者

时间:2013-06-11 20:16:23

标签: c# delegates event-handling

我正在研究微软为win8开发提供的一些示例。我打开了 BasicControls 示例,注意到LayoutAwarePage类,更准确地说ObservableDictionary类。阅读implementing eventsraising them我无法确定谁有责任举起MapChangedEventHandler事件。基于参数,我相信private void InvokeMapChanged(CollectionChange change, K key)方法可以做到这一点。但根据MSDN,我们需要提供一个以 On 开头的受保护方法,该方法在ObservableDictionary中不会出现。

那么,谁提出了MapChangedEventHandler

1 个答案:

答案 0 :(得分:1)

类中的事件可以从类中引发,而不需要额外的方法。

所以,如果MapChangedEventHandler是一个事件,可以通过它从类内部调用它:

if (MapChangedEventHandler != null)
    MapChangedEventHandler( parameters );

我能看到的唯一动机(我不是专家)对于那些OnWhatever方法的存在是允许在事件from outside中引发事件,或from some derived class,因为事件只能从宣告类中提出。

那些OnWhatever方法必须是某些good practice(不是规则,也不是编译器规则)。 也许他们还会在筹集活动的同时照顾一些额外的东西。 如果没有提供它们,可能它们不应该从外部或派生类中调用。


顺便说一句,MapChangedEventHandler不是一个事件。这是一个代表。 事件可以是那种类型,但它们的名称是独立的。

像这样:

class TestClass
{
    these are the events of the class:
    public event MapChangedEventHandler SomeEvent1;
    public event MapChangedEventHandler SomeEvent2;
    public event MapChangedEventHandler SomeEvent3;

    //now this method calls the events (events can only be raised from inside the class)
    public void SomeMethod()
    {
        //do lots of stuff
        if (SomeEvent1 != null) SomeEvent1(whatever arguments it takes);

        //do other stuff
        if (SomeEvent2 != null) SomeEvent2(another arguments);
    }

    //now, if you want to let derived classes to raise events...
    protected void OnSomeEvent3(Same Parameters As MapChangedEventHandler)
    {
        if (SomeEvent3 != null) SomeEvent3(parameters);
    }
}