2013-10-09 109 views
1

我订阅/创建一个自定义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

当你使用Lambda你需要保留一个引用来取消订阅。

试试这个

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

谢谢@SriramSakthivel,是解决我的问题。 –

+0

不客气.. –

+0

“保留一个参考”是一个观点。 – qakmak

1

这是因为你的方法没有事件处理程序的签名相匹配。在你的第一个例子中,你正在创建一个带有正确签名的匿名方法,它调用你的方法并将anon方法添加为事件处理程序。

如果你不喜欢这种方法,那么简单地创建一个满足签名并调用其他方法的包装方法,这实际上就是你在做什么,例如,

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

然后,您可以以正常方式这样组装起来:

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

谢谢你,BenRobinson,你的答案奏效了,但@ SriramSakthivel的回答正是我想要的。 –

0

一个例子:

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

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

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