2009-07-01 52 views
2

我現在正在重構其他人編寫的代碼,並且我找到了一個我對此有複雜感受的構造。有一個類似ListView的控件及其中的每個項目都可以引發'DialogOpened'事件。但是,向每個項目註冊外部事件處理程序可能會很麻煩(並且可能會動態添加或刪除項目!)。出於這個原因,在類似ListView的控件中有一個事件,它被命名爲「ItemDialogOpened」。這聽起來對我來說都合理,但有兩個問題:事件重定向是C#中的一個好習慣嗎?如果屬實,誰應該是'發件人'?

  1. 沒有在ListView般的控制提高單個事件的方法「OnItemDialogOpened」,但這種方法不直接調用。相反,它被註冊爲每個項目的「DialogOpened」事件的事件處理程序。那可以嗎?我在問,因爲我在MSDN中找不到類似的東西。
  2. 如果這樣的事件重定向是好的,那麼誰應該是最終單一事件的發件人?現在,我正在使用的代碼是原始發件人 - 該項目。但是,我認爲(但我不確定),現在發送者應該改爲類似ListView的控件。我對嗎?

回答

1

對於1:此方法不完全適合標準流程模式。從我的角度來看,您必須以私有方法隱藏您自己的實現邏輯(此方法將以每個項目的端點爲終止點),然後此方法將調用受保護的虛擬方法OnItemDialogOpened。在這種情況下,listview可以被繼承,通信邏輯將是透明的,並且更像ms,並且訂閱者將在不投射的情況下工作(因爲投射隱藏在你的私人方法中)。類似的東西:

private void DialogOpenedHandler(object sender, EventArgs e) 
{ 
    OnItemDialogOpened(new ItemEventArgs((YourItemClass)sender); 
} 

protected virtual OnItemDialogOpened(ItemEventArgs e) 
{ 
    // call event here 
} 
3

2 - 這是一個位開放口譯。 一般你會認爲sender是你訂閱的東西;任何其他信息都應通過args傳達 - 但也有例外情況,其中(例如)單個項目以sender的形式出現。

重要的是要清楚地記錄它。

相關問題