Les meilleures pratiques pour l'ouverture d'une nouvelle fenêtre avec WPF MVVM modèle
Je me demandais à ce sujet pendant un certain temps... Quelle est la meilleure pratique pour l'ouverture d'une nouvelle fenêtre (vue & viewmodel) à partir d'un autre viewmodel SI nous gardons à l'esprit que le viewmodel qui ouvre la nouvelle fenêtre n'est pas au courant de l'existence de ce point de vue (comme il faut).
Grâce.
- J'ai répondu à une question très semblable dans ce post.
- Veuillez donner votre solution de télécharger le code source
Vous devez vous connecter pour publier un commentaire.
Je n'utilise pas le ViewModel pour ouvrir un autre point de Vue/ViewModel. C'est dans la responsabilité d'un Contrôleur. Le ViewModel peut informer le Contrôleur (par exemple via un Événement) que l'utilisateur s'attend à voir la Vue suivante. Le Contrôleur crée le ViewModel avec l'aide d'un Conteneur IoC.
La façon dont cela fonctionne est indiqué dans le ViewModel (EmailClient) exemple d'application de la WPF Cadre applicatif (WAF).
Je préfère utiliser un délégué action qui est insérée par le ViewModel constructeur. cela signifie également que nous pouvons facilement vérifier, au cours de tests unitaires:
Utiliser le médiateur motif comme mvvmlight le messager de classe:
http://mvvmlight.codeplex.com/Thread/View.aspx?ThreadId=209338
L'idée de base est de ce dernier envoie un message à son point de vue. La réception de vue ressemble alors à ceci:
Cela permet le viewmodel qui a envoyé le message à afficher une autre fenêtre avec aucune connaissance de comment ou qui a fait l'ouverture.
Personnellement, je préfère soit de déclencher des événements dans mon ViewModel de signal à la vue qu'il doit faire quelque chose comme ouvrir une fenêtre. J'essaie de ne pas le faire directement, de sorte que je ne vois pas les choses comme un événement nommé OpenWindow dans mon ViewModel parce que cela semble violer la séparation entre la Vue et le ViewModel, à mon avis. Au lieu de ce que je pourrais faire est d'avoir une Propriété qui change d'état et soulève un événement PropertyChanged en conséquence, dans lequel le point de vue peut écouter et ensuite décider d'ouvrir une fenêtre en réaction à ce signal. Dans certains cas, l'ouverture d'une fenêtre n'est pas liée à quelque chose dans le ViewModel à tous et c'est uniquement fonction de la Vue. Dans ces cas, je ne suis pas du tout peur pour placer le code pour l'ouverture d'un autre point de vue dans le code-behind de la partie de la Vue.
La médiateur modèle tout à fait de cette plus faiblement couplés et offre des possibilités où une fenêtre principale de l'application ou sur un très imbriquées Vue pouvait écouter les messages dans le monde entier au sein de l'application sans avoir un accès direct à Viewmodel pour joindre les gestionnaires d'événements et de ces. Pour filtrer les messages qui sont dénuées de pertinence, vous pouvez regarder une sorte de message de la source de valeur ou une autre indication de l'endroit où le message provient. Pour ceux à l'aise avec l'idée de Messages de Windows et comment ça fonctionne entre les différents contrôles (Windows) dans un délai non géré et WinForms de développement peut être un moyen de comprendre un système peut être construit au-dessus d'un médiateur qui diffuse des messages.
Je suis d'accord avec un médiateur comme approche, mais la OnMsgReceived est clairement traitée dans le code-behind de la vue, est-il un bon moyen pour éviter cela?