2013-02-14 3 views
0

У меня есть 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». Уродливый!

Какова наилучшая практика для достижения этой цели? Или существуют даже «лучшие» решения? А как насчет производительности?

+3

Рассматривали ли вы с помощью команд? –

+0

Возможно, управление этой кнопкой было недостаточно подходящим для этой цели. Речь идет не о реализации команды в этом месте, потому что я хотел бы также подписаться на события, такие как событие SelectionChanged * * (надеюсь, что это существует, например, в 'ComboBox'). –

ответ

0

Вы можете использовать DelegateCommand, чтобы связать ваши кнопки и что-то еще с командами в ViewModel.

<Button Command="{Binding MyCommand}"/> 

ViewModel:

public DelegateCommand MyCommand {get;set;} //INotifyPropertyChanged, etc. 

private void ExecuteMyCommand() 
{ 
    //Do stuff here. 
} 

public MyViewModel() 
{ 
    MyCommand = new DelegateCommand(ExecuteMyCommand); 
} 
Смежные вопросы