2012-02-24 10 views
5

vorrei chiamare un comando quando viene selezionata una TabItem della mia TabControl.utilizzare un comando con TabItem

C'è un modo per farlo senza rompere il modello MVVM?

+1

È possibile anche l'associazione a IsSelected e gestire le modifiche a che io immobili sul tuo ViewModel. – Will

risposta

6

Utilizzare un AttachedCommand Behavior, che vi permetterà di associare un comando ad eventi WPF

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

Naturalmente, se si sta utilizzando il modello di progettazione MVVM e vincolante SelectedItem o SelectedIndex, si potrebbe anche eseguire il comando in l'evento PropertyChanged

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

Esso può essere fatto utilizzando le seguenti classi insieme:

  • EventTrigger classe dalla System.Windows.Interactivity namespace (System.Windows.Interactivity montaggio).
  • EventToCommand classe dal GalaSoft.MvvmLight.Command namespace (MVVM Light Toolkit assemblaggio, per esempio, 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> 

creare un'istanza del comando nel costruttore ViewModel:

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

Questo è solo 'Interactivity' dalla [SDK Miscela] (http://www.microsoft.com/download/en/details.aspx?id=10801), non hai bisogno di un quadro MVVM per utilizzare questo. –

+0

@ H.B., È corretto per il 'EventTrigger' di classe. Ma la classe 'EventToCommand' appartiene a MVVM Light Toolkit. –

+0

questione connessa: http://stackoverflow.com/q/5868589/490018. –

Problemi correlati