2009-02-03 7 views
8

Déclaration de problèmeComment maintenir la cohérence entre le modèle et le modèle de vue dans le modèle MVVM?

J'écris une application WPF très simple de modifier le contenu d'un fichier de configuration. Le format de données est un fichier XML avec un schéma. Je veux l'utiliser comme un projet d'apprentissage pour MVVM, donc je l'ai dûment divisé le code dans

  • Modèle: classes C# généré automatiquement à partir xsd.exe

  • View-Modèle : Représentation conviviale du modèle.

  • Voir: XAML et le code vide derrière

Je comprends comment la vue-modèle peuvent View-lier un jeu d'enfant. Cependant, cela ne laisse-t-il pas le View-Model < -> Sémantique du modèle très gênant? Xsd.exe génère des classes C# avec des tableaux pour plusieurs éléments XML. Cependant, au niveau V-VM, vous avez besoin de collections observables.

Questions:

Est-ce que cela signifie vraiment que je dois garder deux types de collections complètement différentes représentant les mêmes données en cohérence? Quelles sont les meilleures pratiques pour maintenir la cohérence entre le modèle et le View-Model?

Répondre

6

Je ne suis pas un grand expert, mais je pense que c'est le cas oui. L'idée générale est en effet de propager le changement entre la vue et le viewModel via Binding, puis entre le ViewModel et le Model via des événements (dans la direction Model -> ViewModel) ou une dépendance (dans l'autre sens). Je ne sais pas comment c'est standard, mais ma compréhension de MVVM est que le ViewModel doit contenir une référence au modèle de sorte que lorsque l'utilisateur modifie la vue, le ViewModel doit appeler le code approprié sur le modèle. Dans l'autre sens, le Modèle devrait déclencher des événements lorsqu'il est modifié, et le ViewModel devrait se mettre à jour en conséquence (le ViewModel étant un observateur du modèle).

2

@ Cela signifie-t-il que je dois conserver deux types de collection complètement différents représentant les mêmes données en cohérence?

Je pense que oui. C'est plutôt ennuyeux, mais ça marche plutôt bien. Heureusement, à l'avenir, nous aurons également un générateur de code pour créer la partie ViewModel.

Karl travaille sur ce point: http://karlshifflett.wordpress.com/mvvm/

2

Vous devez clairement ObservableCollections au viewmodel, oui, vous aurez besoin de deux complètement différents types de collections dans le modèle et dans le viewmodel.

J'ai fait un article à propos de faire annuler/rétablir dans MVVM où vous pouvez trouver une solution possible à cela. Il utilise ce que j'appelle le MirrorCollection: une classe dérivée ObservableCollection qui obtient automatiquement ses éléments à partir d'une liste (la liste du modèle).

Je pense qu'il est une solution intéressante, vous pouvez trouver les articles ici

Part 1: Using the Viewmodel pattern to provide Undo/Redo in WPF

Part 2: Viewmodelling lists (ici est la définition MirrorCollection)

0

événements Expose ou délégués dans le modèle et le crochet à la même dans ViewModel, lorsque les valeurs du modèle changent, notifier à viewmodel via l'événement ou les délégués et à partir de Viewmodle, vous pouvez mettre à jour l'interface utilisateur.

Si vous souhaitez le mettre à jour du modèle de vue à modéliser aussi simple que cela il suffit d'appeler une méthode passer les nouvelles valeurs

Questions connexes