如何将 lambda 表达式事件分配给另一个事件
How to assign a lamba expression event to another event
我正在动态定义一个 wpf window,其中包含一些以编程方式定义的文本框和复选框。
添加它们后,我想检查是否所有文本框和复选框都已填充。
要为文本框做到这一点,我有 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) =>{ ... }
但这没有意义,因为 window 没有 comboboxclose 事件
要么这样,要么在定义所有组合框时能够执行类似的操作:
newComboBox.ComboBoxClosed += (senderEvent, args) =>{ ...clone from mw.KeyDown }
提前致谢
你不能,他们是不同类型的代表。
DropDownClosed 是一个 EventHandler,而 KeyDown 是一个 KeyEventHandler,因此当您编写 lambda 时,args 在一个中是 EventArgs 类型,在另一个中是 KeyEventArgs,它们只是从分配中推断它的类型。
如果它们都在 EventHandlers 或 KeyEventHandlers 中,那么您可以将其保存到一个变量并分配给该变量。
方法签名不同,因此您不能完全那样做。但是,您可以将所有 lambda 指向一个通用方法:
private void MyHandler()
{
//bulk of the work
}
//....
mw.KeyDown += (s,e) => MyHandler();
mw.ComboBoxClose += (s,e) => MyHandler();
如果您需要 EventArgs,您可以传递它并对 MyHandler
中的类型进行某种切换
我正在动态定义一个 wpf window,其中包含一些以编程方式定义的文本框和复选框。 添加它们后,我想检查是否所有文本框和复选框都已填充。 要为文本框做到这一点,我有 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) =>{ ... }
但这没有意义,因为 window 没有 comboboxclose 事件
要么这样,要么在定义所有组合框时能够执行类似的操作:
newComboBox.ComboBoxClosed += (senderEvent, args) =>{ ...clone from mw.KeyDown }
提前致谢
你不能,他们是不同类型的代表。
DropDownClosed 是一个 EventHandler,而 KeyDown 是一个 KeyEventHandler,因此当您编写 lambda 时,args 在一个中是 EventArgs 类型,在另一个中是 KeyEventArgs,它们只是从分配中推断它的类型。
如果它们都在 EventHandlers 或 KeyEventHandlers 中,那么您可以将其保存到一个变量并分配给该变量。
方法签名不同,因此您不能完全那样做。但是,您可以将所有 lambda 指向一个通用方法:
private void MyHandler()
{
//bulk of the work
}
//....
mw.KeyDown += (s,e) => MyHandler();
mw.ComboBoxClose += (s,e) => MyHandler();
如果您需要 EventArgs,您可以传递它并对 MyHandler