2008-10-20 117 views
23

我在應用程序中有多個圖層,並且我發現自己不得不將事件吹到GUI層以進行狀態欄更改等。 。我發現自己必須重複編寫代碼,其中每一層只需訂閱來自較低層的事件,然後在回調中簡單地向事件鏈上報事件。有沒有更有效的方法來做到這一點?冒泡事件。

回答

29

如果你正在做的是從另一個事件處理程序中觸發一個事件處理程序,那麼可以裁剪掉中間人並直接在事件的add/remove塊中掛接事件處理程序。

例如,如果你有一個「SaveButtonClick」事件用戶控件,以及所有你想做的事時,就是調用事件處理程序上點擊你的用戶控件的「SaveButton」的時候,你可以這樣做:

public event EventHandler SaveButtonClick 
{ 
    add { this.SaveButton.Click += value; } 
    remove { this.SaveButton.Click -= value; } 
} 

現在,您不需要任何代碼來觸發SaveButtonClick事件 - 當SaveButton.Click事件被引發時(即當有人單擊該按鈕時)它將自動被觸發。

+0

聽起來很有趣。希望看到實施。 – 2008-10-20 02:55:56

0

您可以擁有僅支持事件的中央通道。該頻道必須是獨立的,因此該圖層只能發佈或訂閱該頻道。

+1

這聽起來很有趣,但解釋很模糊。你能舉一些例子嗎? – spoulson 2008-10-20 01:43:36

1

除非我看到更多的設計..它會很難給出一個很好的答案。

WPF確實(自動)將UI組件/控件樹冒泡起來......現在已經內置到框架中了。所以我想這是推薦的方式:)

繞過中間人Layer2的麻煩在於Layer1和Layer3現在彼此認識...耦合。所以它是一個權衡..如果你對聯軸器沒問題..消除中間人/發明一個專門的組件與這個責任。但是,如果你期望第3層是熱插拔(低耦合),我會說繼續冒泡。

0

看看Update Controls .NET。這些控件甚至通過業務邏輯層來發現他們依賴的數據模型的各個部分。您不必編寫任何代碼來通知他們。

3

閱讀Jeremy Miller的博客「The Shade Tree Developer」,特別是他的Write Your Own CAB series - 他談論的命令模式可能是你需要的東西。