J'ai lu sur le motif MVVM à partir de diverses sources telles que MSDN:
http://msdn.microsoft.com/en-us/magazine/dd419663.cox p>
Dans cet article, il dit: Contrairement au présentateur en MVP, une vue de vue ne fait pas Besoin d'une référence à une vue em>. p> si la vue (xaml) suppose qu'il est dataContext est la vue de la vue, puis dans le code est la ligne suivante: p> La vue ne sait pas quelque chose à propos de la vue afin qu'il ne puisse donc pas définir le DataContext. Si je donne le point de vue de la référence, est-ce que je brise le motif MVVM? Mon autre choix est d'avoir une sorte de constructeur ou d'une présentatrice supplémentaire dont le seul travail est de filer le tout (attendre l'événement chargé de la vue, définissez le DataContext). P> Je sais que la vue différente peut partager Le même datacontext (par exemple, définir le DataContext uniquement pour le MainWindow et d'autres le verront) mais dans de nombreux cas qui n'est pas possible du tout ni même réalisable. P> P>
4 Réponses :
Shawn Wildermuth a un excellent publication sur la question de savoir si la vue ou la viewModel vient en premier: http://wildermuth.com/2009/05/22/which_came_first_the_view_or_the_model P >
J'aime et utilisez-le, son concept de mariage où une classe de 3ème partie crée à la fois la vue et la viewModel, puis associe les deux. Ça a bien fonctionné pour moi. P>
C'est une excellente question qui a de nombreuses réponses. Tout dépend de la façon dont vous voulez archiver votre demande. Par exemple, j'utilise une injection de dépendance pour créer mon IViewModel, qui crée à son tour mon iview et mon iviewModel exécute un iview.sepielwmodel (this) sur le constructeur.
D'autres personnes peuvent souhaiter utiliser une méthode plus mélangée en définissant le DataContext Dans XAML: P>
<UserControl.DataContext> <ns:CrazyViewModel /> </UserControl.DataContext>
J'utilise beaucoup de mvvm avec prisme. Dans Prisme, j'utilise l'unité pour la dépendance injection. Par conséquent, j'ai une interface pour chaque classe enregistrée avec l'unité, y compris la vue. L'interface IVIEW a une méthode comme celle-ci:
public partial class View:UserControl, IView { public View() { ... } public SetViewModel(object viewModel) { this.DataContext = viewModel; } }
Quant à ma propre usage, la viewModel ne connaît pas la vue, ni aucune interface sur la vue. Et la plupart du temps, la vue ne connaît pas sa viewmodel, même si elle est moins importante. Le VM est simplement transpiré par le DataContext. P>
Cela garantit que le VM et V resteront très indépendants. Les liens sont établis des liaisons, commandant, comportements, déclencheurs et ainsi de suite. Même si VM est souvent très lié à une vue donnée, j'essaie de le rendre aussi générique que possible, de sorte que je puisse changer la vue correspondante, et / ou adapter le comportement de la vue sans avoir à mettre à jour la machine virtuelle, sauf si le lien architecturale entre V et M est affecté! P>