Как отключить анонимное событие?

Возможный дубликат:
Как отменить регистрацию? обработчик события anonymous

У меня такой код:

        Binding bndTitle = this.DataBindings.Add("Text", obj, "Title");
        bndTitle.Format += (sender, e) =>
        {
            e.Value = "asdf" + e.Value;
        };

Как мне теперь отключить событие форматирования?


person AngryHacker    schedule 20.09.2010    source источник


Ответы (1)


К сожалению, вы не можете этого сделать. Вы можете создать локальный объект для хранения лямбды, если удалите событие в той же области:

Binding bndTitle = this.DataBindings.Add("Text", obj, "Title");
EventHandler handler = (sender, e) =>
{
    e.Value = "asdf" + e.Value;
};

bndTitle.Format += handler;
// ...
bndTitle.Format -= handler;
person Chris Schmich    schedule 20.09.2010
comment
Вы не можете присвоить лямбда-выражение неявно типизированной локальной переменной. Это должен быть обработчик ConvertEventHandler = (отправитель, e) = ›{e.Value = asdf + e.Value; }; - person DoctorFoo; 21.09.2010
comment
И поскольку вам нужно присвоить ему тип, он не может быть анонимным. - person DoctorFoo; 21.09.2010
comment
@Richard Hein, вы ошибаетесь, метод может быть анонимным, но иметь тип (преобразовываться в делегат). Анонимность метода (лямбда) означает, что на него нельзя ссылаться по имени. - person Andrey; 21.09.2010
comment
@Audrey Да, я ошибся, ты прав. Тем не менее, это не будет компилироваться. - person DoctorFoo; 21.09.2010
comment
В этом случае Rx очень полезен. Используя Rx, вы можете сделать это: Binding bndTitle = this.DataBindings.Add (Text, obj, Title); var handler = Observable.FromEvent ‹ConvertEventHandler, ConvertEventArgs› (h = ›new ConvertEventHandler (h), h =› bndTitle.Format + = h, h = ›bndTitle.Format - = h); DisableHandler = handler.Subscribe (e = ›e.EventArgs.Value = asdf + e.EventArgs.Value); Затем вы сохраняете ссылку на DisposeHandler и вызываете Dispose (), когда захотите. - person DoctorFoo; 21.09.2010
comment
@ Ричард Хайн: вы, конечно, правы, что касается стрельбы от бедра :) Я обновил свой ответ, чтобы отразить реальность. - person Chris Schmich; 21.09.2010