2010-02-06 57 views
4

我在class內訂閱Event。如C#Event Passing/Bubble Up

MainStation mainStation = StationFactory.GetMainStation(); 
mainStation.FrequencyChanged += new EventArgs(MainStation_FrequencyChanged); 

MainStation類僅通過調用事件FrequencyChanged()

的問題

提出了一些條件的情況下現在我有一種情況,我必須MainStation實例SubStation這也是MainStation的一個子類,具有一些附加功能和FrequencyChanged事件必須訂閱作爲MainStation subscrbed。考慮下面的代碼說明:

public class MainStation 
{ 
    public event EventHandler FrequencyChanged; 
    public static SubStation CreateSubStation() 
    { 
     SubStation subStation = new SubStation(); 
     //here I want to pass/bubble FrequencyChanged event to SubStation 
     subStation.FrequencyChanged = FrequencyChanged; //THIS IS WRONG 
    } 
} 

底線
我想火一個類從另一個類訂閱事件,也冒泡事件

更新
StationFactory創建MainStationMainStation實例中的FrequencyChanged事件按照第一個代碼塊中的定義進行設置。

+2

只是想知道爲什麼這是CW。看起來像是一個有明確答案的好問題。只是好奇......;) – IAbstract 2010-02-06 19:10:00

回答

7

如果FrequencyChanged不屬於MainStation,而是一些Base,你將不得不鏈和揭露你有興趣的事件。

public class MainStation : Base 
{ 
    public event EventHandler StationFrequencyChanged; 

    public MainStation() 
    { 
     // ... 

     this.FrequencyChanged += new EventHandler(MainStation_FrequencyChanged); 
    } 

    void MainStation_FrequencyChanged(object sender, EventArgs e) 
    { 
     if (StationFrequencyChanged != null) 
      StationFrequencyChanged(sender, e); 
    } 

    public void GetEventsFrom(MainStation src) 
    { 
     //this is where you assign src events to your object 
     this.StationFrequencyChanged = src.StationFrequencyChanged; 
    } 

    public static SubStation CreateSubStation(MainStation main) 
    { 
     SubStation subStation = new SubStation(); 

     //register events  
     subStation.GetEventsFrom(main); 

     return subStation; 
    } 
} 

public class SubStation : MainStation 
{ 

} 
+0

感謝Dynami的回覆!似乎這就是我想要的。我現在無法測試代碼,因爲我正在移動。我會盡快進行測試,並讓你知道。再次感謝! – 2010-02-06 19:31:29

0

如果你需要的東西更靈活,有可能使用WPF RoutedEvents。

或者手動實現類似的方法:將對象組織到樹中並編寫一個事件管理器,該事件管理器可以從樹節點向上路由事件。如果樹層次結構符合您的需求,那麼比處理器中的每個單獨事件都更加方便和可預測。

0

如果您的CreateSubStation方法不是靜態的,那麼您擁有的代碼將按預期工作。 (假設MainStation上的事件處理程序是在您創建Substation之前設置的......這不是一個很好的設計,IMO。)