使用自定义参数取消订阅/删除事件处理程序

时间:2013-10-09 15:58:16

标签: c# wpf visual-studio events event-handling

我使用以下代码订阅/创建自定义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

3 个答案:

答案 0 :(得分:3)

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

试试这个

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

答案 1 :(得分:0)

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

如果您不喜欢这种方法,那么简单地创建一个包装方法来完成签名并调用另一种方法,这实际上就是您正在做的事情。

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

然后您可以按正常方式连接它:

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

答案 2 :(得分:0)

一个例子:

EventHandler myEvent = (sender, e) => MyMethod(myParameter);//my delegate

myButton.Click += myEvent;//suscribe
myButton.Click -= myEvent;//unsuscribe

private void MyMethod(MyParameterType myParameter)
{
 //Do something
}