La mise en œuvre de “fermer la fenêtre” commande avec MVVM
Donc ma première tentative n'avait tout le code derrière, et maintenant je suis en train de revoir mon code pour utiliser le pattern MVVM, suivant les conseils de l'MVVM dans la boîte de l'information.
J'ai créé une classe viewmodel pour correspondre à mon point de vue de classe, et je me déplace le code de la code de derrière dans le viewmodel de départ avec les commandes.
Mon premier hic, c'est d'essayer de mettre en œuvre un bouton "Fermer" qui ferme la fenêtre si les données n'ont pas été modifiés. Je l'ai affublé d'une CloseCommand pour remplacer le "onClick" méthode et tous est bon, sauf pour le cas où le code tente d'exécuter this.Close()
. Évidemment, puisque le code a été déplacé à partir d'une fenêtre à une classe normale, 'ce' n'est pas une fenêtre et n'est donc pas fermer. Toutefois, selon le modèle MVVM, le viewmodel ne sais pas à propos de la vue, de sorte que je ne peux pas appeler view.Close()
.
Quelqu'un peut-il suggérer comment je peux fermer la fenêtre du viewmodel de commande?
- Plusieurs options ont déjà été discutés [stackoverflow.com/questions/4376475/... de manière générale l'approche que je voudrais utiliser est le CommandParameter avec une source par rapport retour à l'appel de la Fenêtre. (Comme illustré par Simone)
- cette solution nécessite Expression Blend? Je suis interpellés sur ce front
- Voir comment utiliser la propriété attachée à résoudre ce ici
- MVVM != sans code-behind.
Vous devez vous connecter pour publier un commentaire.
Vous n'avez pas besoin de passer à l'instance de Vue de votre couche ViewModel. Vous pouvez accéder à la fenêtre principale, ce
Je ne vois pas de problème à accéder à votre fenêtre principale dans le ViewModel de la classe comme indiqué ci-dessus. Comme par MVVM le principe, il ne devrait pas être un couplage étroit entre votre point de Vue et ViewModel c'est à dire ils devraient être conscient de autres opérations. Ici, nous ne sommes pas passer quelque chose à ViewModel de la Vue. Si vous voulez chercher d'autres options de ce qui pourrait vous aider - Fermer la fenêtre en utilisant MVVM
Personnellement, j'utilise une approche très simple: pour chaque ViewModel qui est lié à un fermer Vue, j'ai créé une base de ViewModel comme l'exemple suivant:
Puis dans votre ViewModel qui hérite de
CloseableViewModel
, il suffit d'appelerthis.OnClosingRequest();
pour laClose
commande.Dans la vue:
Ma solution pour fermer une fenêtre de la vue modèle en cliquant sur un bouton comme suit:
Dans le modèle de vue
En Vue, définie comme suit
Window
)?obj
est null dans mon cas? Mais je neCommandParameter="{Binding ElementName=myWindow}"
en XAML, ce qui peut être mauvais?- Je le faire par la création d'une joint propriété DialogResult:
puis écris pour vous XAML, dans la fenêtre de la balise
enfin dans le ViewModel
si vous modifiez le Fermer à true, la fenêtre sera fermée
Watch out pour la mode paradigmes. MVVM peut être utile, mais vous ne devriez vraiment pas le traiter comme un ensemble de règles rigides. Utilisez votre propre jugement, et quand il ne fait pas de sens - ne l'utilisez pas.
Les solutions proposées ici (à l'exception de @RV1987 de la solution) sont un très bon exemple que les choses sortir de la main. Vous remplacez un seul
Close()
appel avec une telle quantité énorme de code, pour quel but? Vous gagnez absolument rien de déplacer le code de fermeture de la vue à la vue-modèle. La seule chose que vous gagnez de la place pour plus de bugs.Maintenant, je ne dis pas que MVVM est d'être ignoré. Bien au contraire, il peut être très utile. Il suffit de ne pas trop le faire.
Ici est la plus simple et pur MVVM solution
ViewModel Code
Voici XAML Afficher le Code
Cette solution est rapide et facile. Inconvénient, c'est qu'il y a de couplage entre les couches.
Dans votre viewmodel:
MVVM-lumière, avec un message personnalisé de notification pour éviter la fenêtre de traiter chaque notificationmessage
Dans le viewmodel:
Enregistrer le message dans la fenêtre constructeur:
Ceci est très similaire à eoldre de réponse. Il est fonctionnellement identique dans la mesure où il regarde dans la même collection Windows une fenêtre qui a le modèle de vue que son datacontext; mais j'ai utilisé un RelayCommand et certains LINQ pour obtenir le même résultat.
utilisant MVVM-light toolkit:
Dans le ViewModel:
Et dans la Vue:
Ceci est pris à partir de ken2k réponse (merci!), tout ajout de la
CloseCommand
également à la baseCloseableViewModel
.Votre modèle de vue, il hérite
En vue
Donné un, s'il vous Plaît vérifier
https://stackoverflow.com/a/30546407/3659387
Courte Description
tout d'abord de donner à votre fenêtre un nom comme
sur mon bouton fermer j'ai défini le Commandement et le Paramètre de Commande comme
alors de mon point de vue modèle