2013-10-09 2 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 с правильной сигнатурой, которая вызывает ваш метод и добавляет метод anon в качестве обработчика события.

Если вы не похожи на этот подход, тогда просто создайте метод обертки, который выполняет подпись и вызывает другой метод, который по сути является тем, что вы делаете, например.

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

Вы можете подключить это в обычном порядке:

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

Спасибо, Бен-Робинсон, ваш ответ сработал, но ответ ШрирамСактивель был именно тем, что я хотел. –

0

Пример:

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

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

private void MyMethod(MyParameterType myParameter) 
{ 
//Do something 
} 
Смежные вопросы