2 события и 1 кнопка. Отписывание от одного и подписка на другое
Всем привет.
Задача: Есть 2 события (А и Б) и 1 кнопка. При выполнении события А (при клике на кнопку) происходит отписка от события А и подписка на событие Б (по аналогии с событием Б).
Сейчас у меня это выглядит так:
if(//some condition)
Button.Click += (sender, e) => Button_Click_A(sender, e, message);
else
Button.Click += (sender, e) => Button_Click_B(sender, e, message);
И в самих же событиях я отписываюсь от них же (извиняюсь за тавтологию):
private void Button_Click_A(object sender, EventArgs e, string message)
{
//some code
Button.Click -= (sender, e) => Button_Click_A(sender, e, message);
}
(2 событие такое же)
И, вроде, всё классно и это работает, но такая реализация мне крайне сильно не нравится. Может есть какой-то более красивый вариант решения этого?
Ответы (1 шт):
Автор решения: Qwertiy
→ Ссылка
Можно сделать как-то так:
private Action<object, EventArgs> currentHandler;
void doSmth()
{
if (currentHandler != null)
throw new InvalidOperationException("Attempt to subscribe when already subscribed");
var message = "Some message";
if(someCondition)
Button.Click += currentHandler = (sender, e) => Button_Click_A(sender, e, message);
else
Button.Click += currentHandler = (sender, e) => Button_Click_B(sender, e, message);
}
private void Button_Click_A(object sender, EventArgs e, string message)
{
if (currentHandler != null)
{
Button.Click -= currentHandler;
currentHandler = null;
}
MessageBox.Show(message);
}
Хотя, в большинстве случаев можно сделать проще:
private string handlerMessage;
void doSmth()
{
handlerMessage = "Some message";
}
private void Button_Click(object sender, EventArgs e)
{
MessageBox.Show(handlerMessage);
}