2009-09-24 3 views
10

Nous construisons une application en utilisant le modèle MVVM, nous avons des contrôleurs qui câblent toutes les vues et viewmodels en utilisant DI. Tous les exemples de MVVM que j'ai vus sont vraiment simplistes et ont une vue. Comment/est-ce que viewmodels doit communiquer avec le contrôleur? Le contrôleur connaît les modèles et les vues, le viewmodel doit-il renvoyer les événements au contrôleur? Où devrait se produire une sauvegarde? Modèle? Manette?Contrôleurs dans MVVM, Comment obtenir des informations de viewmodel à son contrôleur?

Répondre

3

Nous utilisons également des contrôleurs, mais dans notre cas, ils sont responsables du flux de travail de l'application. Le contrôleur connaît le ViewModel et le modèle mais pas la vue concrète car celle-ci sera injectée par le conteneur IoC.

Si vous êtes intéressé par un exemple qui montre plus d'une interface utilisateur (de dialogue modale, assistant avec flux de travail conditionnel), vous pouvez jeter un oeil à:

cadre WPF Application (WAF) - http://waf.codeplex.com

+1

Ya nous faisons les choses le contraire. Notre contrôleur connaît une interface de vue et injecte le viewmodel et le modèle. – nportelli

5

Votre ViewModel ne peut-il pas dépendre d'un contrôleur IController ou d'une autre interface, pour pouvoir y répondre? J'essaie de garder le plus possible de logique d'application hors du ViewModel, car ces classes peuvent facilement devenir gonflées. Je suis d'accord avec le fait que les frameworks MVVM ont tendance à être trop simplistes avec leurs échantillons. En particulier, le déplacement entre les vues/écrans dans votre application est quelque chose que j'aimerais voir plus d'exemples de. Je crée une interface IViewManager, pour permettre à mes ViewModels de demander que nous passions à une autre vue.

+1

Eh bien, le contrôleur connaît le viewmodel, nous ne voulons pas une dépendance 2 voies passe ou la chance que viewmodel mon être réutilisé par un autre contrôleur. – nportelli

+1

Hmmmm, je ne suis pas entièrement sûr de comprendre le motif que vous utilisez. Voulez-vous dire que vous avez un contrôleur par vue? N'est-ce pas plus MVC que MVVM? Peut-être pourriez-vous ajouter un petit exemple de code à votre question pour montrer comment vous créez une vue et un viewmodel. –

+0

Un contrôleur par vue non, un contrôleur par cas d'utilisation. Désolé si je n'ai pas précisé cela. – nportelli

1

Je vous utilise une configuration similaire. Dans mon contrôleur, où mon DI et l'injection de vue descend, je garde parfois la référence au ViewModel (qui tiennent la vue). Dans certains cas, je peux avoir un événement sur la VM qui est géré par le contrôleur. Dans d'autres cas extrêmes (comme si le VM/V était créé en dehors du contrôleur, disons dans une autre VM), je pourrais même utiliser l'EventAggregator (avec un ref fort) pour écouter les événements qui pourraient être déclenchés sur la VM. Dans ce cas, une référence stockée sur la machine virtuelle n'est pas nécessaire.

+0

Notre contrôleur ne connaît pas la VM. Juste et interface à la vue. La VM est injectée à partir de là. L'idée est que le contrôleur ne connaît pas le modèle que l'interface utilisateur met en œuvre, de sorte que nous pouvons potentiellement échanger l'interface utilisateur facilement. Ce qui conduit à nos problèmes, je pense. – nportelli

0

Que diriez-vous d'utiliser des événements dans lesquels le contrôleur souscrit à des événements VM ou à l'aide d'un modèle de médiateur dans lequel un médiateur est injecté dans une machine virtuelle.

Questions connexes