2012-02-24 5 views
5

Я хотел бы вызвать команду, когда выбран TabItem моего TabControl.Использовать команду с TabItem

Есть ли способ сделать это, не нарушая шаблон MVVM?

+1

Вы также можете привязать к IsSelected и обработать изменения этого свойства i n ваш ViewModel. – Will

ответ

6

Используйте AttachedCommand Behavior, который позволит вам связать команду с WPF событий

<TabControl ... 
    local:CommandBehavior.Event="SelectionChanged" 
    local:CommandBehavior.Command="{Binding TabChangedCommand}" /> 

Конечно, если вы используете шаблон проектирования MVVM и связывания SelectedItem или SelectedIndex, вы можете также запустить команду PropertyChanged событие

void MyViewModel_PropertyChanged(object sender, PropertyChangedEventArgs e) 
{ 
    if (e.PropertyName == "SelectedIndex") 
     RunTabChangedLogic(); 
} 
5

Это можно сделать, используя следующие классы вместе:

  • EventTrigger класс от System.Windows.Interactivity пространство имен (System.Windows.Interactivity сборка).
  • EventToCommand класс от GalaSoft.MvvmLight.Command пространства имен (MVVM Light Toolkit сборки, например, GalaSoft.MvvmLight.Extras.WPF4):

XAML:

<Window ... 
     xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity" 
     xmlns:cmd="clr-namespace:GalaSoft.MvvmLight.Command 
     ...> 
... 
    <TabControl> 
     <i:Interaction.Triggers> 
      <i:EventTrigger EventName="SelectionChanged"> 
       <cmd:EventToCommand Command="{Binding TabSelectionChangedCommand}" 
            PassEventArgsToCommand="True" /> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

     <TabItem>...</TabItem> 
     <TabItem>...</TabItem> 
    </TabControl> 
... 
</Window> 

Создать экземпляр команды в ViewModel конструктора:

TabSelectionChangedCommand = new RelayCommand<SelectionChangedEventArgs>(args => 
    { 
     // Command action. 
    }); 
+1

Это просто «Интерактивность» из [Blend SDK] (http://www.microsoft.com/download/en/details.aspx?id=10801), вам не нужна инфраструктура MVVM, чтобы использовать это. –

+0

@ H.B., Это правильно для класса EventTrigger. Но класс EventToCommand принадлежит к MVVM Light Toolkit. –

+0

Связанный вопрос: http://stackoverflow.com/q/5868589/490018. –

Смежные вопросы