2

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

4

3 回答 3

4

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

尝试这个

RoutedEventHandler handler = (sender, e) => MyButtonClick(sender, e, stuff1, stuff2);
myButton.Click +=  handler;//Subscribe
//Some more code
myButton.Click -=  handler;//Unsubscribe
于 2013-10-09T16:02:55.523 回答
0

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

如果您不喜欢这种方法,那么只需创建一个满足签名并调用其他方法的包装器方法,这基本上就是您正在做的事情,例如

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

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

myButton.Click += MyButtonClickWrapper
myButton.Click -= MyButtonClickWrapper
于 2013-10-09T16:06:26.523 回答
0

一个例子:

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

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

private void MyMethod(MyParameterType myParameter)
{
 //Do something
}
于 2018-01-19T09:33:49.237 回答