2014-11-14 83 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”级。