取消订阅/删除带有自定义参数的事件处理程序

本文关键字:参数 自定义 事件处理 程序 删除 取消 | 更新日期: 2023-09-27 18:34:31

我使用以下代码订阅/创建自定义Event Handler

myButton.Click += (sender, e) => MyButtonClick(sender, e, stuff1, stuff2);


我想取消订阅/删除并尝试如下:

myButton.Click += MyButtonClick;

但抛出以下错误:
No overload for 'MyButtonClick' matches delegate 'System.Windows.RoutedEventHandler'


像这样:

myButton.Click += MyButtonClick(sender, e, stuff1, stuff2);

但抛出以下错误:
Cannot implicitly convert type 'void' to 'System.Windows.RoutedEventHandler'


如何取消订阅/删除相同的Event Handler

取消订阅/删除带有自定义参数的事件处理程序

当您使用Lambda时,您需要保留它的引用才能取消订阅。

试试这个

RoutedEventHandler handler = (sender, e) => MyButtonClick(sender, e, stuff1, stuff2);
myButton.Click +=  handler;//Subscribe
//Some more code
myButton.Click -=  handler;//Unsubscribe

这是因为您的方法与事件处理程序的签名不匹配。 在第一个示例中,您将创建一个具有正确签名的 anon 方法,该方法调用您的方法,并将 anon 方法添加为事件处理程序。

如果您不喜欢这种方法,那么只需创建一个包装器方法来履行签名并调用另一个方法,这本质上就是您正在做的事情,例如

public void MyButtonClickWrapper(object sender, EventArgs e)
{
    MyButtonClick(sender, e);
}

然后,您可以按正常方式将其连接起来:

myButton.Click += MyButtonClickWrapper
myButton.Click -= MyButtonClickWrapper

一个例子:

EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate
myButton.Click += myEvent;//suscribe
myButton.Click -= myEvent;//unsuscribe
private void MyMethod(MyParameterType myParameter)
{
 //Do something
}