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

C# 如何将lamba表达式事件分配给另一个事件,c#,wpf,events,combobox,textbox,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. Tha

我以编程方式定义了一个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
}
但是,当combobox关闭时,如何将要触发的相同代码关联起来?? 最好将上述代码更改为(伪代码):

但这没有意义,因为窗口没有comboboxclose事件

无论是这样,还是定义所有组合框时,都可以执行以下操作:

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

提前谢谢你

不行,他们是不同类型的代表

DropDownClosed是一个EventHandler,而KeyDown是一个KeyEventHandler,因此当您编写lambda时,args在其中一个中是EventArgs类型,在另一个中是KeyEventArgs类型,它们只是从赋值推断它的类型


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

方法签名是不同的,因此您不能完全这样做。但是,您可以将所有lambda指向一个通用方法:

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

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

如果您需要EventArgs,您可以将其传递,并在
MyHandler

中的类型上执行某种切换。窗口不是组合框,因此它没有mw.ComboBoxClose事件!哦,我明白了。您必须从
MyWindow
手动向上/重新提升ComboBoxClose。那太乱了
newComboBox.ComboBoxClosed +=  (senderEvent, args) =>{ ...clone from mw.KeyDown }
private void MyHandler()
{
    //bulk of the work
} 

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