У меня есть ControlTemplate
для пользовательского элемента управления, который выглядит следующим образом (упрощенный):Лучшая практика для подписки на события элемента управления в DataTemplate?
<ControlTemplate TargetType="CustomControl">
<Grid>
<Grid.Resources>
<DataTemplate TargetType="CustomClassA">
<TextBlock Text={Binding ClassASpecificProperty}" />
</DataTemplate>
<DataTemplate TargetType="CustomClassB">
<TextBlock Text={Binding ClassBSpecificProperty}" />
</DataTemplate>
</Grid.Resources>
<ContentControl Content="{TemplateBinding Content}" />
</Grid>
</ControlTemplate>
Красота этого в том, что конкретный Content
, в зависимости от его типа (А или В), отображаются по-разному , вызванные DataTemplate
s, определенные для каждого типа.
Однако. Иногда бывает не только TextBlock
с. Представьте, что в этих DataTemplates были кнопки. Иногда вы хотите подписаться на события Click
с определенными методами. Но эти шаблоны управления обычно находятся в ResourceDictionary
, поэтому нет кода за для размещения методов корреспондирования обработчиков Click
.
Я видел три различных решения, все же:
- Создание CustomResourceDictionary с кодом позади файла attatched
- Override
OnApplyTemplate
метод (я не очень понимаю это, хотя) и подписаться на события программно - Работа с прикрепленными сообщениями и обработка логики пользовательского интерфейса в «ViewModel». Уродливый!
Какова наилучшая практика для достижения этой цели? Или существуют даже «лучшие» решения? А как насчет производительности?
Рассматривали ли вы с помощью команд? –
Возможно, управление этой кнопкой было недостаточно подходящим для этой цели. Речь идет не о реализации команды в этом месте, потому что я хотел бы также подписаться на события, такие как событие SelectionChanged * * (надеюсь, что это существует, например, в 'ComboBox'). –