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