MVVM Afficher la référence à ViewModel
Je suis en utilisant MVVM dans une application WPF. Je suis très nouveau à la fois. Permettez-moi de préciser que je ne suis pas la plus pure dans le pattern MVVM, je suis en train de l'utiliser comme bon nombre de pratiques exemplaires que je peux, mais j'essaie de faire, je pense que ce sont des compromis raisonnables pour le faire fonctionner dans notre environnement. Par exemple, je ne suis pas d'essayer d'atteindre 0% de code, à mon avis, le code-behind.
J'ai quelques questions à propos de les meilleures pratiques.
1) je comprends que je ne veux pas que mes VM savoir à propos de l'attaché de Vue, mais il est raisonnable pour la Vue de disposer d'une référence à son VM?
2) Si un contrôle en Vue ouvre un autre point de Vue (comme une boîte de dialogue) dois-je les traiter dans la Vue? Il semble mal à le gérer dans le VM depuis la VM a quelques connaissances d'un point de Vue spécifique.
source d'informationauteur BrettRobi | 2010-03-29
Vous devez vous connecter pour publier un commentaire.
1) Le point de Vue a certainement une référence à ce Dernier par le DataContext. Et vous êtes autorisé à lancer le DataContext de la Vue:
Ce n'est pas une violation avec le Modèle-Vue-Vuemodèle modèle.
.
2) Vous avez raison. Un ViewModel ne devrait pas ouvrir un autre point de Vue. Une meilleure approche est d'utiliser des Contrôleurs. Ils sont responsables pour le Flux de travail d'une application.
Si vous êtes intéressé par des informations plus détaillées, alors vous pourriez avoir un coup d'oeil à la WPF Cadre applicatif (WAF).
1) Voici deux simples pratiques pour la Vue "connaître" un ViewModel. C'est raisonnable pour une Vue à propos d'un ViewModel (Liaison de Données), mais vous ne pouvez pas besoin de cela dans votre cas. Voir si l'une de ces approches aident à résoudre votre problème. Il ya d'autres façons, mais ce devrait être assez simple:
La première option n'est pas mauvais si vous avez un emplacement de service de l'outil, mais il est une saveur de MVVM qui n'aime pas tout le code dans la Vue de Code-Behind. La deuxième option n'est pas mal non plus, devrait être assez simple pour votre tâche.
2.) Cette question peut être un peu collante point de MVVM de conception. Si nous parlons d'un général Win32 MessageBox, je vais souvent à l'écart de cette logique dans un objet supplémentaire et de le mettre dans la machine virtuelle. De cette façon, a tendance à un peu plus clair. (Pour exemple, j'ai sélectionné un élément dans une zone de liste, j'ai joint une Suppression ICommand à cette action, et dans mon ViewModel lorsque cette ICommand est Exécuté, je vais pousser ma MessageBoxObject demander si l'utilisateur veut vraiment supprimer cet élément). Plus avancé "Dialogues" serait d'utiliser d'autres Viewmodel et DataTemplates pour ceux Viewmodel. Je préfère le Médiateur approche.
1). La vue aura besoin d'une référence à la vue du modèle, à un certain niveau, puisque ce dernier agira comme datacontext de la vue.
2) Une façon de gérer cela est de disposer d'un généralisées viewmodel représentant une boîte de dialogue, qui est détenue par le principal viewmodel (l'un étant utilisé comme le point de vue datacontext.)
Vous pouvez utiliser une commande pour créer une nouvelle instance de dialogue viewmodel, ce qui aura un correspondant datatemplate défini dans vos ressources. Ce modèle sera mis à se lier à la dialogviewmodel type.
Assez tardivement, mais je pense que c'est difficile assez pour mériter beaucoup de points de vue différents.
Comme déjà répondu, une bonne Vue-Vuemodèle arrangement comporte le ViewModel être affecté comme DataContext de la Vue de la propriété. Qui permet DataBindings être "automagiquement" établi à partir de XAML déclaratif, ou affiné via le code derrière.
Parfois, vous serez tenté d'écrire, dans votre code derrière, quelque chose comme ceci:
Je crois que la bonne façon de réaliser ce genre de choses n'est PAS à jeter DataContext, mais plutôt:
Ont certains dédié de contrôle en Vue, par exemple un ItemsControl avec son ItemsSource les deux sens lié aux données de certains propriété dans le viewmodel:
<ItemsSource x:Name="cleverControl" Visibility="Collapsed" ItemsSource="{Binding CleverProperty, Mode=TwoWay}"/>
Fonte de la limite de propriété au lieu de l'ensemble du ViewModel, dans le code behind:
var collection = (ObservableCollection<double>)cleverControl.ItemsSource;
collection.Add(someValue);
Remarque la différence importante: la deuxième approche dans cet exemple ne nécessite pas le point de Vue de connaître le ViewModel type, il n'a besoin que d'une propriété nommée
CleverProperty
de typeObservableCollection<double>
. Cela me permet d'avoir polymorphes ou même de canard-tapé Viewmodel.Cela ne devrait pas arriver dans le strict MVVM, et il n'est pas difficile d'éviter d'utiliser DataTemplates. DataTemplates carte d'un type donné de DataContext à un type donné de vue, si à tout moment le datacontext de un ContentControl changements, son affichage change également, à condition que vous ayez un DataTemplate pour ce type:
Un contrôle de la vue pourrait envoyer un commande pour le ViewModel, qui à son tour permettrait de mettre à jour certains de ses propres propriétés, qui se traduirait par la vue.
Un point de Vue pourrait contenir un autre point de Vue, en dehors de la connaissance du ViewModel. Dans ce cas, le code de l'arrière peut manipuler le datacontext de la vue.
Il y a plus de subtilités, mais j'ai été en utilisant cette approche, avec de bons résultats. Espérons que cela aide quelqu'un.
Construire Votre Propre Framework MVVM
J'ai trouvé l'approche suggérée par Rob Eisenberg très intéressant.
Points clés:
Qui est très similaire à ASP.NET philosophie MVC.
Je recommande fortement de regarder la vidéo.