如何将lamba表达式事件分配给另一个事件

时间:2016-02-26 17:52:50

标签: c# wpf events combobox textbox

我正在定义一个wpf窗口,其中包含一些以编程方式定义的文本框和复选框。 添加它们之后,我想检查是否所有文本框和复选框都已填满。 要为文本框执行此操作,我将使用lamda表达式定义事件:

var mw = new MyWindow();
mw.KeyDown += (senderEvent, args) =>
{
  cycle on all windows and when it's a TEXTBOX or a COMBOBOX analyze if it's empty or not.
  That is a lot of code which I wouldn't not replicate nor use an external routine
}

但是当关闭组合框时,如何将相同的代码关联起来? 最好的方法是将上面的代码更改为(伪代码):

mw.AllEvents += (senderEvent, args) =>{ ... }

mw.KeyDown && mw.ComboBoxClose += (senderEvent, args) =>{ ... }

但这没有意义,因为窗口没有组合结合事件

这个或者在定义所有组合框时能够做到这样的事情:

newComboBox.ComboBoxClosed +=  (senderEvent, args) =>{ ...clone from mw.KeyDown }

提前谢谢

2 个答案:

答案 0 :(得分:2)

方法签名不同,因此您无法做到这一点。但是,您可以将所有lambdas指向一个常用方法:

private void MyHandler()
{
    //bulk of the work
} 

//....
mw.KeyDown += (s,e) => MyHandler();
mw.ComboBoxClose += (s,e) => MyHandler();

如果你需要EventArgs,你可以通过它并对MyHandler

中的类型进行某种切换

答案 1 :(得分:1)

您不能,他们是不同类型的代表。

DropDownClosed是一个EventHandler,而KeyDown是一个KeyEventHandler,所以当你编写lambda时,args在一个中键入EventArgs而在另一个中键入KeyEventArgs,他们只是从分配中推断它的类型。

如果它们都是EventHandlers或KeyEventHandlers,那么你可以将它保存到变量并分配该变量。