2010-01-29 2 views
2

Я создал метод расширения, который работает так, как я хотел. Я заметил, что как-то параметры party и property «копируются» в выражение лямбда. Таким образом, мне не нужно поддерживать собственный список ассоциаций editor/party/property.Повторить метод расширения лямбда

Однако мне нужно сбросить событие ButtonClick ButtonEdit. Поскольку это анонимно, я не могу использовать - = opertor.

Итак, мой вопрос: как мне переписать этот метод, чтобы делегат мог быть удален? Или, какой другой подход я могу использовать для обработки конкретного обработчика событий с дополнительными параметрами (например, party и property)?

private static void SetupAddressButtonClickEvent(this ButtonEdit editor, Party party, string property) 
{ 
    editor.SetAddressDisplayText(party, property); 
    editor.ButtonClick += (sender, e) => 
     { 
      party.ShowAddressLookupDialog(property); 
      editor.SetAddressDisplayText(party, property); 
     }; 
} 

Спасибо, Стефан

ответ

3
Action<object,EventArgs> myaction = (sender, e) => 
     { 
      party.ShowAddressLookupDialog(property); 
      editor.SetAddressDisplayText(party, property); 
     }; 

editor.ButtonClick += myaction; 
editor.ButtonClick -= myaction; 

редактировать вариант 2 может быть:

class MyEventHandler 
{ 
    ... _property; 
    ... _party; 
    ... _editor; 
    public MyEventHandler(... property, ... party, ... editor) 
    { 
    _property = property; 
    _party = party; 
    _editor = editor; 
    } 

    public void Handler(object sender, EventArgs e) 
    { 
    _party.ShowAddressLookupDialog(_property); 
    _editor.SetAddressDisplayText(_party, _property); 
    } 
} 

, а затем использовать его как это:

var handler = new MyEventHandler(party,property,editor); 
editor.ButtonClick += handler.Handler; 

Я не уверен, насколько это поможет вам, потому что я не на 100% понимаю, что вы пытаетесь решить.

+0

Так что мне нужно сохранить список ассоциаций ButtonEdit/Action внутри? – Stefan

+0

Я не знаю, где вы пытаетесь удалить действие, поэтому я не могу помочь с его удалением. Вы пытаетесь удалить его в другом обработчике кликов? –

+0

Я удаляю обработчик событий, прежде чем повторно привязывать элементы управления к форме. Обработчик события будет ссылаться на расположенный объект, если я его не сброшу. Однако ваш вариант 2 выглядит интересным. Имеет ли этот подход название? – Stefan

Смежные вопросы