2013-06-11 84 views
0

我正在研究微軟提供的win8開發的一些示例。我打開BasicControls樣本並注意到LayoutAwarePage類,更確切地說ObservableDictionary類。閱讀約implementing eventsraising them我看不到誰負責籌集MapChangedEventHandler事件。根據參數我相信private void InvokeMapChanged(CollectionChange change, K key)方法可以做到這一點。但根據MSDN,我們需要提供一個受保護的方法,以開頭,不會出現在ObservableDictionary中。ObservableDictionary事件提升者

那麼,誰提出MapChangedEventHandler

回答

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); 
    } 
} 
+0

我明白了。但根據Microsoft編譯器創建用於在類和_上聲明的事件的私有事件變量_編譯器還創建了兩個公共方法add_EventName和remove_EventName。這些方法是事件掛鉤,它允許代理組合或從事件代理eh中移除。這些細節對程序員來說是隱藏的._正如你在_if_中指出的那樣,如果事件不爲null,則會被調用。我懷疑是誰創建了EventHandler。我不知道它是否在Add_Event隱藏方法上創建。 – learner

+0

事件始終以空委託形式開始。處理程序方法是在向事件添加處理程序時創建的:'SomeClass.SomeEvent + = SomeHandler;'。向事件添加處理程序使其不爲空。刪除處理程序時:'SomeClass.SomeEvent - = SomeHandler;' –

+0

是的。問題是LayoutAwarePage類沒有任何這種註冊事件。正因爲如此,我無法理解這個事件到現在爲止。 – learner