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 que celle-ci (manipulation-dialogues-en-wpf-avec-mvvm) ...
J'ai un formulaire de «connexion» écrit en utilisant le modèle MVVM.
Ce formulaire a 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 a également une commande "Login" qui est liée au bouton "Login" sur le formulaire, agan utilisant une liaison de données normale.
Lorsque la commande "Login" se déclenche, elle appelle une fonction dans le ViewModel qui s'éteint et envoie des données sur le réseau pour se connecter. Lorsque cette fonction se termine, il y a 2 actions:
La connexion n'était pas valide - nous montrons juste un MessageBox et tout va bien
La connexion était valide, nous devons fermer le formulaire de connexion et le faire renvoyer vrai comme son
DialogResult
...
Le problème est que le ViewModel ne sait rien de la vue réelle, alors comment peut-il fermer la vue et lui dire de renvoyer un DialogResult particulier ?? Je pourrais coller du code dans le CodeBehind, et / ou passer la vue au ViewModel, mais il semble que cela vaincrait entièrement le point de MVVM ...
Mettre à jour
En fin de compte, je viens de violer la «pureté» du modèle MVVM et j'ai demandé à View de publier un Closed
événement et d'exposer une Close
méthode. Le ViewModel appelle alors simplement view.Close
. La vue n'est connue que via une interface et câblée via un conteneur IOC, donc aucune testabilité ou maintenabilité n'est perdue.
Il semble plutôt idiot que la réponse acceptée soit à -5 voix! Bien que je sois bien conscient des bons sentiments que l'on ressent 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 dans le nom de "motifs" et de "pureté" est un peu ridicule ....
Close
méthode simple est toujours la meilleure solution. Tout le reste sur les autres dialogues plus complexes est MVVM et databound, mais il semblait tout simplement idiot d'implémenter les énormes "solutions" ici au lieu d'une simple méthode ...