【问题标题】:How to assign a lamba expression event to another event如何将 lambda 表达式事件分配给另一个事件
【发布时间】:2016-02-26 17:52:50
【问题描述】:

我正在动态定义一个 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) =>{ ... }

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

无论是这个还是在定义所有组合框以能够执行以下操作时:

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

提前谢谢你

【问题讨论】:

    标签: c# wpf events combobox textbox


    【解决方案1】:

    方法签名是不同的,所以你不能完全那样做。但是,您可以将所有 lambda 表达式指向一个通用方法:

    private void MyHandler()
    {
        //bulk of the work
    } 
    
    //....
    mw.KeyDown += (s,e) => MyHandler();
    mw.ComboBoxClose += (s,e) => MyHandler();
    

    如果您需要 EventArgs,您可以通过它并在 MyHandler 中对类型进行某种切换

    【讨论】:

    • 一个窗口不是一个组合框,所以它没有 mw.ComboBoxClose 事件!
    • 哦,我明白了。您必须从MyWindow 手动传递/重新提高您的 ComboBoxClose。太乱了
    【解决方案2】:

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

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

    如果它们都在 EventHandlers 或 KeyEventHandlers 中,则可以将其保存到变量并分配该变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-01-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多