2013-10-09 108 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 
}