2012-02-24 12 views
5

Chciałbym wywołać komendę po wybraniu TabItem w moim TabControl.Użyj polecenia z TabItem

Czy istnieje sposób, aby to zrobić bez łamania wzoru MVVM?

+1

Można również powiązać z IsSelected i obsłużyć zmiany tej właściwości. w swoim ViewModelu. – Will

Odpowiedz

6

Użyć AttachedCommand Behavior, który pozwoli Ci powiązać polecenie do WPF zdarzeń

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

Oczywiście, jeśli używasz wzorzec projektowy MVVM i wiążące SelectedItem lub SelectedIndex, można również uruchomić polecenie w zdarzenie PropertyChanged

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

można to zrobić przy użyciu następujących klas razem:

  • EventTrigger klasa z przestrzeni nazw System.Windows.Interactivity (System.Windows.Interactivity).
  • EventToCommand z klas GalaSoft.MvvmLight.Command namespace (MVVM Light Toolkit montażu, na przykład 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> 

Tworzenie wystąpienie polecenia w konstruktora ViewModel:

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

To tylko "Interaktywność" z [Blend SDK] (http://www.microsoft.com/download/en/details.aspx?id=10801), nie potrzebujesz żadnej platformy MVVM do korzystania z tego. –

+0

@ H.B., Jest poprawne dla klasy 'EventTrigger'. Ale klasa 'EventToCommand' należy do MVVM Light Toolkit. –

+0

Powiązane pytanie: http://stackoverflow.com/q/5868589/490018. –

Powiązane problemy