J'essaie d'apprendre WPF et le problème MVVM, mais j'ai rencontré un problème. Cette question est similaire mais pas tout à fait la même comme celui-ci (handling-dialogs-in-wpf-with-mvvm) ...
J'ai un formulaire "Login" écrit en utilisant le modèle MVVM.
Ce formulaire possède un ViewModel qui contient le nom d'utilisateur et le mot de passe, qui sont liés à la vue dans le XAML à l'aide de liaisons de données normales. Il possède également une commande "Login" qui est liée au bouton "Login" du formulaire, là encore à l'aide de liaisons de données normales.
Lorsque la commande "Login" est activée, elle invoque une fonction dans le ViewModel qui envoie des données sur le réseau pour permettre la connexion. Lorsque cette fonction s'achève, il y a deux actions :
-
Le login n'était pas valide - nous affichons simplement une MessageBox et tout va bien.
-
La connexion étant valide, nous devons fermer le formulaire de connexion et faire en sorte qu'il renvoie true en tant que
DialogResult
...
Le problème est que le ViewModel ne sait rien de la vue actuelle, alors comment fermer la vue et lui demander de renvoyer un DialogResult particulier ? Je pourrais mettre du code dans le CodeBehind, et/ou passer la vue au ViewModel, mais cela semble aller à l'encontre de l'idée même de MVVM...
Mise à jour
En fin de compte, j'ai violé la "pureté" du modèle MVVM et j'ai fait en sorte que la vue publie un fichier Closed
et d'exposer un Close
méthode. Le ViewModel n'aurait alors qu'à appeler view.Close
. La vue n'est connue que par l'intermédiaire d'une interface et est reliée à un conteneur IOC, ce qui permet d'éviter toute perte de testabilité ou de maintenabilité.
Il semble assez stupide que la réponse acceptée soit à -5 voix ! Bien que je sois conscient des bons sentiments que l'on éprouve en résolvant un problème tout en étant "pur", je ne suis sûrement pas le seul à penser que 200 lignes d'événements, de commandes et de comportements juste pour éviter une méthode d'une ligne au nom des "modèles" et de la "pureté" est un peu ridicule.....
0 votes
J'ai utilisé les comportements joints pour fermer la fenêtre. Liez une propriété "signal" sur votre ViewModel au comportement attaché (j'utilise en fait un déclencheur). Lorsqu'elle vaut true, le comportement ferme la fenêtre. http://adammills.wordpress.com/2009/07/01/window-close-from-xaml/