2010-09-14 3 views
0

Ok je suis en train de comprendre WPF et le modèle MVVM populaire.MVVM WPF: Reflétant une propriété de contrôle à l'viewmodel, lorsqu'un événement se déclenche

Maintenant, j'ai cette question. J'utilise un contrôle de ruban avec plusieurs onglets. Dans ma ViewModel j'ai une propriété "ActiveTab (string)" Qui devrait refléter l'onglet actuellement actif.

Depuis RibbonControl n'a aucune propriété qui affiche ces informations je ne peux pas se lier à elle.

donc je pensais:

je pourrais lier l'événement sélectionné comme ceci:

 <r:RibbonTab Label="tab1" Selected="RibbonTab_Selected"></r:RibbonTab> 
     <r:RibbonTab Label="tab2" Selected="RibbonTab_Selected"></r:RibbonTab> 
     <r:RibbonTab Label="tab3" Selected="RibbonTab_Selected"></r:RibbonTab> 
     <r:RibbonTab Label="tab4" Selected="RibbonTab_Selected"></r:RibbonTab> 
     <r:RibbonTab Label="tab5" Selected="RibbonTab_Selected"></r:RibbonTab> 

Puis en codebehind définir la propriété dans le viewmodel en utilisant ActiveTab = sender.Label

Mais Ensuite, j'aurais besoin d'une référence à mon viewmodel dans le code derrière mon point de vue.

Je suis en train de résoudre ce problème sans utiliser le code derrière des fichiers. (MVVM).

Maintenant la vraie question: Est-il en quelque sorte possible d'utiliser un eventtrigger ou un eventetter. que lorsque l'événement sélectionné est déclenché. Un setter définit automatiquement la propriété activetab sur l'expéditeur. Valeur d'étiquette?

En utilisant XAML seulement.

- Mes excuses pour ma question plutôt mauvaise anglais et peut-être noobish. Je suis très nouveau à WPF =)


MISE À JOUR: Comme je viens de découvrir, il y a une propriété isSelected sur un ribbonTab.

Maintenant, j'ai quelques problèmes sur la façon de lier à la propriété dans mon viewmodel.

J'ai essayé le code suivant:

<Style TargetType="{x:Type r:RibbonTab}"> 
       <Style.Triggers> 
        <Trigger Property="IsSelected" Value="True"> 
         <Setter Property="{Binding SelectedTab}" Value="{Binding RelativeSource=Self, Path=Label}" /> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 

Mais cela ne fonctionne pas:

Error 1 Cannot find the Style Property 'SelectedTab' on the type 'Microsoft.Windows.Controls.Ribbon.RibbonTab'. 

selectedTab est biensur dans mon viewmodel et non ribbonTab ...

Comment je fais le setter, définissez la propriété sur mon viewmodel avec la valeur de l'onglet? =)

Merci d'avance !!

Répondre

1

La version d'août du Ruban Microsoft, le RibbonTab a une propriété de dépendance IsSelected, vous devriez donc pouvoir lier à cela.

+0

Omg vous avez complètement raison. Pourquoi la documentation du ruban est-elle si limitée ... :(. –

0

Je suis surpris que le RibbonControl n'expose pas cela comme une propriété liable, mais je ne l'ai pas vraiment, donc je vais vous utilisé suppose avez raison ...

Vous ne pouvez faire les liaisons vers ou à partir d'une propriété de dépendance et si le ruban n'a pas de propriété de dépendance de tabulation active, vous devrez en créer un vous-même. Vous pouvez le faire en sous-classant le contrôle du ruban dans l'un des vôtres, en y ajoutant la propriété et en utilisant les gestionnaires d'événements Selected pour mettre à jour sa valeur.D'un autre côté, si vous n'utilisez que ceci sur une vue, vous pouvez ajouter la propriété à la vue au lieu de sous-classer le ruban et lier à cela. Dans les deux cas, vous devez placer l'onglet sélectionné dans le moteur de liaison pour pouvoir lier quoi que ce soit (le label ou le viewmodel) et accéder uniquement au moteur via les propriétés de dépendance. Vous ne pourrez donc pas le faire entièrement en XAML, mais vous pourrez le faire sans introduire de couplage entre la vue et viewmodel.


regardant la documentation pour le contrôle du ruban Microsoft pour WPF Avez-vous essayé la propriété Ribbon.SelectedItem? Il me semble qu'il devrait vous donner l'onglet actuellement sélectionné.

+0

Vous avez tous les deux raison, j'ai une propriété liable. Je ne pouvais tout simplement pas le trouver dans la doucmentation: \ ... –

+0

J'ai mis à jour ma question. =) –

Questions connexes