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