MVVM (avec WPF) - Liaison de Plusieurs Vues de la Même ViewModel
J'ai récemment commencé à enquêter sur le pattern MVVM avec WPF pour un projet à venir. J'ai commencé avec Josh Smith l'article MSDN. j'ai une question (bien nombreux, mais nous allons commencer avec une):
J'ai un IndividualViewModel qui expose les propriétés du modèle. J'ai besoin de deux points de vue "Ajouter une Personne" et "Modifier Individuel" qui sont très similaires, comme vous pouvez l'imaginer. Ce que j'ai fait actuellement est d'avoir 2 sous-classes AddIndividualViewModel et EditIndividualViewModel qui exposent les Ajouter et de Modifier des commandes, respectivement. J'ai aussi 2 de même nommé points de vue qui se lient à ces.
Maintenant cette méthode fonctionne et ces classes sont assez petits, de toute façon, mais je me demandais si c'est possible pour moi d'avoir juste le modèle de vue, qui expose à la fois les commandes. J'aurais encore 2 points de vue qui se lient à ce point de vue même modèle, l'exposition de la commande appropriée comme un bouton. Je ne suis pas tout à fait sûr de savoir comment le faire. Dans la fenêtre principale ressources que j'ai quelque chose comme:
<DataTemplate DataType="{x:Type ViewModels:AddIndividualViewModel}">
<Views:AddIndividualView />
</DataTemplate>
Avec cette méthode de liaison que vous ne pouvez avoir qu'un one-to-one de liaison, c'est à dire le même point de vue est toujours indiqué pour un modèle de vue. Est-il un moyen de passer automatiquement de la vue en fonction d'une propriété sur le modèle de vue (p. ex. IndividualViewModel.Mode). Est-il une approche différente, je devrais être pris en compte?
Notez que la fenêtre principale a une collection de modèles de vue et montre chaque onglet.
Merci!
OriginalL'auteur Bimf | 2010-01-01
Vous devez vous connecter pour publier un commentaire.
Merci de me pointer dans la bonne direction! Je suis encore nouveau avec WPF et de l'apprentissage sur toutes les possibilités, y compris les méthodes de reliure. De toute façon, pour toute personne intéressée, voici la solution que j'ai obtenus pour ce cas particulier:
J'ai décidé que je voulais avoir le point de vue des modèles séparés en deux sous-classes AddIndividualViewModel et EditIndividualViewModel qui n'exposent que des commandes, plutôt que d'essayer de la gestion de l'état dans la seule classe. Cependant, je voulais un point de vue alors que je ne suis pas dupliquer le code XAML. J'ai fini à l'aide de deux DataTemplates et DataTemplateSelector pour passer sur les boutons d'action selon le modèle de vue:
et un contenu presenter au bas de la forme:
Voici le code pour le sélecteur de modèle:
Cela peut ou peut ne pas être de savoir comment mettre en œuvre la dernière chose (étant donné les exigences), mais il est bon de voir que j'ai ce genre d'option.
OriginalL'auteur Poya M.
Si vous avez besoin de 2 différents points de vue basés sur la valeur d'une propriété. Une chose à considérer est de restructurer le code de présentation, donc au lieu de les valeurs d'une propriété, vous pourriez avoir de vrais sous-classes. Ensuite, vous pouvez utiliser 2 différents
DataTemplate
pour chaque classe.Si vous pensez que c'est inutile, vous pouvez utiliser un déclencheur et enveloppez vos vues dans un
ContentPresenter
.OriginalL'auteur wigy
Il n'y a aucune raison pourquoi vous ne devriez pas être en mesure d'y parvenir. Une façon de le faire est de fournir un indicateur dans votre modèle d'affichage indiquant si vous êtes en mode ajout, ou en mode édition, et le style de votre vue en fonction de cet indicateur à l'aide de simples liaisons, des déclencheurs ou des modèle des sélecteurs.
Pour référence, vous pouvez regarder Sacha salon de coiffure
DataWrapper
de la classe qui fait partie de sonCinch
cadre (pas directement applicables à votre cas, mais c'est un bon point de départ) qui enveloppe les champs de données dans le modèle de vue de manière à soutenir un drapeau pour basculer entre lecture seule (vue en mode d'enregistrement), et en lecture-écriture (modifier le mode d'enregistrement). Vous pouvez appliquer une approche similaire pour faire la distinction entre, d'ajouter et de modifier des.En gros, au lieu d'avoir des propriétés simples dans votre modèle de vue, instancier une classe wrapper de données qui comprend une
Value
de la propriété, et unIsAdding
de la propriété. À votre avis, vous pouvez utiliser des fixations, des déclencheurs ou modèle sélecteurs de modifier des modèles fondés sur la propriété.OriginalL'auteur Aviad P.
Pour cette tâche, vous n'avez pas besoin de tout DataTemplateSelector à tous.
En xaml vous liez dans la contentgrid à votre VM propriété comme cela:
OriginalL'auteur msfanboy