Guide composite pour WPF: MVVM vs MVP
Je suis confus. Peut-être que vous pourrez m'aider 🙂
J'ai suivi les conseils de CAG et a trouvé le modèle MVP très naturel pour moi.
Supposons que j'ai une INTERFACE utilisateur-Modèle (par exemple : application de INotifyPropertyChanged), j'utilise le présentateur de lier ce Modèle de vue (présentateur sait une interface de la vue), en gardant mon Code-Behind aussi petit que possible de la gestion des Liaisons (Modèle et Commandes), les propriétés (ou les méthodes) ou des événements pour les contrôles qui n'ont pas de ICommand et dans ce cas immédiatement délégué à l'animateur.
- Après un certain temps, j'ai découvert le pattern MVVM, et jusqu'à présent, il m'échappe.
Aussi loin que je peux dire dans mon approche, je voudrais utiliser MVVM seulement quand mon Modèle n'est pas de l'INTERFACE utilisateur. Mais serait-il plus raisonnable de garder le présentateur et il suffit d'utiliser un nouveau Modèle, je n'arrive pas à comprendre de quoi ai-je perdre avec ce type d'utilisation.
Je sais que je suis absent quelque chose, mais qu'en est-il :). - Également lors de votre point de Vue est générique et peut gérer de nombreux types de Modèles (comme dans une grille de propriété). ViewModel est recommandé pour être utilisé avec un DataTemplate, mais dans ce cas, vous ne pouvez pas créer un Modèle pour chaque entité de votre Modèle, il est juste besoin d'être étudiés dans l'exécution, que recommanderiez-vous?
- Tout en regardant Josh Smith parle de MVVM dans un screencastj'ai eu le sentiment que la re exposant du Modèle dans le ViewModel est en train de violer SEC (ne pas répéter à vous-même), est-il vraiment inévitable? ça m'étonne que personne ne son disputer à ce sujet dans la comparaison entre les flammes ADO.Net Dynamique de Données des classes de métadonnées sont arriver aujourd'hui.
Espère que c'est suffisamment clair
Grâce
Ariel
source d'informationauteur ArielBH
Vous devez vous connecter pour publier un commentaire.
Sujet #3, beaucoup de gens l'utilisation d'une couche d'indirection" argument, en disant que les changements dans le modèle ne sera pas affecter la vue. Alors que c'est techniquement correct, il n'est pas la vraie raison de faire quelque chose comme ça.
Si vous considérez le Modèle que les entités que vous obtenez en retour à partir de, disons, une couche d'accès aux données ou d'un service (c'est ce que ces sont généralement considérés comme) vous commencez à voir pourquoi vous avez besoin d'un ViewModel. Un ViewModel est conçu pour étendre le modèle à l'aide de comportements le point de Vue des besoins.
Par exemple. Si vous voulez être en mesure de modifier une propriété et d'avoir le point de Vue avisé de ce changement par le biais de la liaison, la propriété a besoin d'élever une certaine forme de NotifyPropertyChanged de sorte que la vue peut réagir. C'est le comportement que votre modèle typique de ne pas en avoir.
Dans un autre exemple, disons que vous avez une collection et vous voulez le drapeau de chaque élément de la collection avec une valeur booléenne lorsqu'un utilisateur clique sur une case à cocher à côté de cet élément dans la vue. Vous auriez besoin d'un "IsSelected de la propriété", probablement. C'est un comportement que le Modèle ne devrait pas avoir à fournir.
Cependant je vois d'où vous venez... j'ai vraiment eu un problème avec cela à tout d'abord. La première fois que j'ai copier et coller le contenu d'un modèle dans mon viewmodel, mon estomac se retourna, mais vous avez juste à faire la paix avec le fait que de votre point de Vue à travailler, il va avoir besoin de ce petit supplément de comportement qu'un Modèle ne devrait pas prévoir.
N'importe comment des nations unies-SEC c'est, en forçant votre WCF types ou LINQ to SQL types (ou quel que soit votre favori ORM) de mettre en œuvre INotifyProperyChanged est pire.
Outre les commentaires ci-dessus. Je tiens à partager une partie de ma compréhension personnelle sur la différence.
Normalement dans MVP vous disposez d'une interface de Vue, par exemple. IView, à l'abstraction des opinions réelles et lier les données à ces opinions réelles. Dans MVVM, au lieu de cela, vous utilisez normalement le DataContext de la vue, par exemple. XAML de contrôle de l'utilisateur, de faire la liaison de données, qui est similaire à la IView au titre de MVP. Donc, disons, à tort, la liaison est similaire sur les deux modèles.
La différence majeure est sur le Présentateur vs ViewModel de la partie. Un modèle de vue est très différent d'un présentateur qui est un pont pour l'échange de données entre l'INTERFACE utilisateur et le modèle. Il est en fait, comme son nom l'indique, un modèle de la vue. Les données exposées dans un ViewModel est principalement pour l'INTERFACE utilisateur du processus. Donc, à partir de ma compréhension, MVVM, le ViewModel est une abstraction de vues. Au contraire, MVP utilise principalement IView à l'abrégé des points de vue. Donc, normalement, il y a quelques couches de MVVM que MVP et donc vous pouvez écrire moins de code pour faire le même travail dans MVVM:
MVVM: Modèle - ViewModel(représente les opinions réelles, c'est à dire. L'INTERFACE utilisateur) - Opinions Réelles
MVP: Modèle de présentation(un pont pour l'échange de données entre le modèle et l'INTERFACE utilisateur) - IView(représente les opinions réelles, c'est à dire. L'INTERFACE utilisateur) - Opinions Réelles
Le MVVM son avantage sur le MVP est principalement basée sur les 2 beaucoup de fonctionnalités dans les produits Microsoft,
Commandant en WPF. Il pourrait être disponible en Silverlight, dans l'avenir, bien qu'il existe déjà certaines implémentations qui ne sont pas en Silverlight runtime
DataContext dans WPF et Silverlight.
Ad.3. Il peut sembler que vous vous répétez en exposant le Modèle dans le ViewModel, mais ce que vous avez vraiment à faire est d'abstraction du Modèle, de sorte que la Vue ne connait que sur cette abstraction (Afficher sait uniquement sur ViewModel).
C'est parce que les modifications apportées au Modèle de ne pas briser la Vue. Aussi, votre Modèle peut être mis en œuvre de nombreux services qui obtenir les données à partir de différentes sources. Dans ce cas, vous ne voulez pas Afficher les connaître tous, afin d'en créer une autre abstraction - ViewModel.
Si le présentateur sait l'interface de la vue, vous devez tous les points de vue utilisés par un présentateur d'avoir la même interface ou faire un présentateur pour chaque vue. Avec MVVM la vue est conscient du viewModel, et le viewModel est conscients de le modèle (mais pas vice-versa). Cela signifie que plusieurs points de vue peuvent utiliser une machine virtuelle et de plusieurs machines virtuelles peut utiliser un Modèle.
Je ne suis pas tout à fait sûr de ce que vous demandez dans votre 2ème point. La machine virtuelle n'est pas le point de Vue (ou de prendre conscience des points de Vue) et pour moi un DataTemplate définit la façon dont un objet est affiché. J'ai mis mon DataTemplates dans un ResourceDictionary ce qui appartient à la Vue. La seule bits de WPF "trucs" dans ma VM couche sont des Commandes.
J'ai besoin d'un peu plus d'informations pour répondre à votre 3ème point. Peut-être qu'il répondra lui-même, si vous creusez un peu plus profond dans MVVM.
Voici un poste de mine de qui pourrait vous aider
Bonne chance.