Теперь я реорганизую код, написанный кем-то другим, и я нашел конструкцию, о которой я испытываю смешанные чувства. Существует элемент ListView-like, и каждый из его элементов может поднять событие "DialogOpened". Тем не менее, может быть громоздко регистрировать внешние обработчики событий для каждого из элементов (и элементы могут быть добавлены или удалены динамически!). По этой причине в элементе управления ListView есть одно событие, и оно называется "ItemDialogOpened". Это звучит для меня все разумно, но есть две проблемы:
Для 1: этот подход не полностью вписывается в стандартный шаблон потока. С моей точки зрения, вы должны скрыть свою собственную логику реализации в приватном методе (этот метод будет конечной точкой для каждого элемента событие DialogOpened), а затем этот метод вызовет защищенный виртуальный метод OnItemDialogOpened. В этом случае listview может быть унаследован, коммуникационная логика будет прозрачной и более ms-подобной, и абонент будет работать без кастинга (поскольку кастинг скрыт в вашем личном методе). Что-то вроде этого:
private void DialogOpenedHandler(object sender, EventArgs e)
{
OnItemDialogOpened(new ItemEventArgs((YourItemClass)sender);
}
protected virtual OnItemDialogOpened(ItemEventArgs e)
{
// call event here
}
Для 2 - он немного открыт для интерпретации. В целом вы ожидаете, что sender
будет тем, на кого вы подписаны; любая другая информация должна передаваться через args
- но есть исключения, где (например) отдельный элемент проходит через sender
.
Важно четко документировать его.