0

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

那么,谁加注MapChangedEventHandler

4

1 回答 1

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);
    }
}
于 2013-06-11T20:31:48.190 回答