У меня есть несколько уровней в приложении, и я обнаружил, что мне приходится пузырять события на уровне графического интерфейса для выполнения изменений в строке состояния и т.д., Мне приходится записывать повторяющиеся коды, где каждый слой просто подписывается на события с нижнего уровня, а затем в обратном вызове просто поднимает событие вверх по цепочке. Есть ли более эффективный способ сделать это?
Переполнение событий.
Ответ 1
Если все, что вы делаете, запускает обработчик событий из другого обработчика событий, вы можете вырезать среднего человека и перехватить обработчики событий непосредственно в блоках добавления/удаления для события.
Например, если у вас есть UserControl с событием "SaveButtonClick", и все, что вы хотите сделать, когда вызывается обработчик события при нажатии "SaveButton" на вашем UserControl, вы можете сделать это:
public event EventHandler SaveButtonClick
{
add { this.SaveButton.Click += value; }
remove { this.SaveButton.Click -= value; }
}
Теперь вам не нужен какой-либо код для запуска события SaveButtonClick - он будет автоматически запущен, когда событие SaveButton.Click будет поднято (т.е. когда кто-то нажимает на эту кнопку).
Ответ 2
Прочитайте блог Джереми Миллера "Разработчик дерева тени", особенно его Напишите свою собственную серию CAB - материал команды, который он говорит о том, что, вероятно, вам нужно.
Ответ 3
Питер Риллинг опубликовал способ моделирования Event Bubbling/Broadcasting в winforms. Это просто и эффективно.
Ответ 4
Если я не увижу немного больше дизайна, вам будет трудно дать хороший ответ.
WPF запускает события пузырьков (автоматически) в дереве компонентов/дерева пользовательского интерфейса... это теперь встроено в структуру. Поэтому я предполагаю, что рекомендуемый способ:)
Проблема с обходом среднего человека Layer2 заключается в том, что Layer1 и Layer3 теперь знают друг друга... связаны. Так что это компромисс. Если вы в порядке с муфтой, устраните среднего человека/придумайте специальный компонент с этой ответственностью. Однако, если вы ожидаете, что уровень 3 будет с возможностью горячей замены (низкая связь), я бы сказал, продолжайте пузыриться.
Ответ 5
У вас может быть центральный канал, поддерживающий только события. Этот канал должен быть независимым, чтобы слой публиковал или подписывался на него.
Ответ 6
Посмотрите Update Controls.NET. Эти элементы управления обнаруживают части вашей модели данных, от которых они зависят даже от слоев бизнес-логики. Вам не нужно писать какой-либо код, чтобы уведомить их.