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