2014-11-14 85 views
1

我爲DataGrid創建了一個擴展。我想知道在事件中做什麼更好的方法。在控件擴展中,覆蓋或addHandler?

是更好地增加一個處理程序是這樣的:

class MyDataGrid : DataGrid { 
    public MyDataGrid() { 
     this.PreviewKeyDown+= MyDataGrid_PreviewKeyDown; 
    } 

    protected void MyDataGrid_PreviewKeyDown(/* args */) {/* do stuff */} 
} 

或與這樣的控制裝置:

class MyDataGrid : DataGrid { 
    public MyDataGrid() { } 
    protected override void OnPreviewKeyDown(/* args */) {/* do stuff */} 
} 

如果我讓base.OnPreviewKeyDown(e);的覆蓋,它做的一樣事件處理程序?

+0

如果您從重寫的方法調用基方法,則兩者都是等效的。 – 2014-11-14 19:27:40

+3

第二個片段更好。它迫使你思考一個你還沒有想過的細節。你在「做什麼」之前調用base.OnPreviewKeyDown()?或之後?還是根本不?現在你不知道的可能性很大,因爲你還沒有想過。它很重要。事件的問題是,如果事實證明它確實重要,則無法解決問題。 – 2014-11-14 19:44:25

回答

0

這可能無所謂。也就是說,你應該重寫該方法 - 它的全部目的是從控制內處理事件。如果添加一個事件處理程序,那麼您無需在事件的調用列表中添加另一個方法(即輕微的性能下降)。

如果你想對性能嚴格/狂熱,那麼你也可以讓你的「MyDataGrid」類「密封」。

sealed class MyDataGrid : DataGrid { ... } 

這使編譯器/運行,以確定它不會需要檢查虛擬方法的任何覆蓋「OnPreviewKeyDown」上方的「MyDataGrid」級。