2017-07-17 11 views
0

J'ai une application silverlight qui utilise un formulaire avec un TabControl.Comment lier TabItem GotFocus à ViewModel comand

Je voudrais avoir l'un des événements TabItem GotFocus à lier à mon ViewModel. Cependant, je reçois des erreurs lorsque je fais ce qui suit.

<controls:TabControl> 
    <controls.TabItem GotFocus="{Binding Model.MyGotFocusCommand}"> 

Puis-je lier les événements tabcontrol à mon ViewModel?

+0

jetez un oeil ici: https://stackoverflow.com/questions/16659592/give-a-tabitem-focus-when-dynamically-adding-using-mvvm –

+0

'Model.MyGotFocusCommand' bien, c'est une odeur de code. Crypter la logique de l'interface utilisateur dans vos modèles et voir les modèles, hein? – Will

Répondre

1

Vous ne pouvez pas lier directement un événement à une commande. L'appel d'une commande sur un événement nécessite l'utilisation des déclencheurs d'interaction Expression Blend.

Ajoutez des références aux assemblys Microsoft.Expression.Interactions.dll et System.Windows.Interactivity.dll.

Déclarer l'interactivité et les interactions préfixes d'espace de noms dans votre vue:

xmlns: i = "http://schemas.microsoft.com/expression/2010/interactivity" xmlns: ei = "http: // schemas.microsoft.com/expression/2010/interactions »

<i:Interaction.Triggers> 
       <i:EventTrigger EventName="GotFocus"> 
        <i:InvokeCommandAction 
Command="{Binding GotFocusCommand}"/> 
      </i:EventTrigger> 
     </i:Interaction.Triggers> 

Si vous n'aimez pas l'utilisation d'expression Blend, vous pouvez aller avec un cadre (par exemple MVVM Light) qui permet la liaison par un comportement. Ceci est exposé via une classe EventToCommand en tant que comportement qui vous permet de lier un événement à une commande. De cette façon, la commande liée est invoquée comme un gestionnaire d'événements lorsque l'événement est déclenché.

<i:Interaction.Triggers> 
    <i:EventTrigger EventName="GotFocus"> 
     <cmd:EventToCommand Command="{Binding Mode=OneWay,Path=GotFocusCommand}" 
          PassEventArgsToCommand="True" /> 
    </i:EventTrigger> 
</i:Interaction.Triggers> 

Last but not least, je trouve souvent acceptable pour attraper tout simplement l'événement dans le code derrière et à partir de là je la route dans mon modèle de vue. Si vous pouvez vivre avec les inconvénients (principalement la perte de testabilité), cette approche est simple et directe.