MVVM WPF: Reflétant une propriété de contrôle à l'viewmodel, lorsqu'un événement se déclenche

StackOverflow https://stackoverflow.com/questions/3708000

Question

D'accord, je suis en train de comprendre WPF et le motif MVVM populaire.

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

Depuis RibbonControl n'a pas de biens qui affiche ces informations je ne peuvent se lier à elle.

Alors 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>

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

Mais alors je besoin d'un refference à mon viewmodel dans le codebehind de mon avis.

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 possible d'utiliser une certaine façon un EventTrigger ou EventSetter. que lorsque l'événement sélectionné est congédié. Un poseur fixe automaticly la propriété ActiveTab à la valeur sender.Label?.

Utilisation XAML uniquement.

- Mes excuses pour mon assez mauvaise question 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 questions sur la façon de le 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 biensur est dans mon viewmodel et non ribbonTab ...

Comment puis-je faire le poseur, définissez la propriété sur mon viewmodel avec la valeur de l'onglet? =)

Merci d'avance !!

Était-ce utile?

La solution

La version Août du ruban Microsoft, le RibbonTab a une propriété de dépendance IsSelected, donc vous devriez être en mesure de se lier à cela.

Autres conseils

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

Vous ne pouvez faire des liaisons vers ou à partir d'une propriété de dépendance et si le ruban ne dispose pas d'un onglet actif propriété de dépendance alors vous aurez besoin de faire vous-même. Vous pouvez le faire en sous-classement le contrôle du ruban dans l'un de vos propres, en ajoutant la propriété à l'aide et les gestionnaires d'événements sélectionnés pour mettre à jour la valeur de lui. D'autre part, si vous n'utilisez ceci sur un point de vue, vous pouvez alors ajouter la propriété à la vue au lieu de ruban et le sous-classement se lient à cela.

De toute façon, vous devez obtenir l'onglet sélectionné dans le moteur de liaison pour pouvoir tout se lient à elle (soit l'étiquette ou l'viewmodel) et il ne peut entrer dans le moteur par les propriétés de dépendance. Donc, vous ne serez pas en mesure de le faire entièrement en XAML, mais vous serez en mesure de le faire sans introduire de couplage entre la vue et viewmodel.


En regardant la documentation pour le contrôle du ruban Microsoft pour WPF avez-vous essayé la propriété Ribbon.SelectedItem? Il me semble que cela devrait vous donner l'onglet sélectionné.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top