2011-02-26 6 views
1

J'ai donc un ViewModel modifiable où je ne voulais pas que ce soit modifiable via une fenêtre de dialogue.WPF: Comment fermer la boîte de dialogue cliquez sur le bouton

Normalement, la vue ViewModels affiche uniquement les données, mais vous pouvez appuyer sur un bouton Modifier qui ouvre une nouvelle fenêtre Xaml en appelant window.showDialog(). La fenêtre prend le viewModel comme DataContext, expose ses propriétés comme éditables et a les commandes Save et Cancel liées aux boutons.

Tout fonctionne bien, mais j'ai quelques problèmes avec cela.

Tout d'abord, la commande de sauvegarde fonctionne mais ne ferme pas la boîte de dialogue. Deuxièmement, cela rompt un peu le MVVM parce que la VM doit connaître la vue EditDialog pour la créer.

Également ce qui se passe lorsque je clique sur le bouton de fermeture X. Je sais qu'un dialogue retournerait normalement faux comme DialogResult mais ici je ne gère pas les résultats.

Est-ce que quelqu'un a fait quelque chose de similaire mais avec élégance en utilisant MVVM?

EDIT

J'ai aussi remarqué que si j'utilise .ShowDialog je ne peux pas modifier quoi que ce soit, même si j'expose comme TextBoxes. Est-ce dû à la façon dont les dialogues modaux sont censés fonctionner?

Répondre

2

Je vois ici deux façons:

1) EditorVM ne sait rien au sujet de dialogue. Dans ce cas, je laisserais cette VM comme un simple éditeur qui expose les propriétés mais n'a pas de SaveCommand. Ensuite, le bouton Save doit être injecté de l'extérieur, quelque part où vous ouvrez une boîte de dialogue. Ensuite, après la fermeture de la boîte de dialogue, vous vérifiez si la boîte de dialogue a été fermée à l'aide du bouton Save ou si elle a été fermée à l'aide du bouton Cancel. Le code qui a ouvert une boîte de dialogue doit alors vérifier le résultat renvoyé et appeler la méthode Save si la boîte de dialogue a été fermée avec le bouton Save. Avec cette approche, vous devrez rendre votre dialogue un peu plus compliqué - vous devrez insérer les boutons Save et Cancel de ShowDialog au lieu de les tirer dans le cadre de ViewModel qui sera affiché. Mais cette approche permet d'isoler votre EditorVM de tout comportement spécifique à la boîte de dialogue.

2) EditorVM suppose qu'il a été ouvert dans la boîte de dialogue et dans le gestionnaire de commandes Save il enregistre son contenu et ferme la boîte de dialogue. Afin d'accéder à la fonctionnalité de dialogue, j'utilise généralement un type de service IWindowManager qui gère toutes les fenêtres ouvertes et peut déterminer quelle boîte de dialogue contient quel viewModel et peut les fermer en conséquence. Fondamentalement ce service IWindowManager a la méthode comme void CloseDialog(object ViewModel);.

+0

Ok Je ne reçois pas la solution 1 complètement. Où ouvrez-vous le dialogue alors? Aussi, je ne suis pas sûr que je serais prêt à ajouter un IWindowManager entier quand je vais seulement avoir 1 Modal au plus ouvert en plus de la fenêtre de l'application. Merci pour votre contribution. –

+0

@ Ingó, j'ai 'IWindowManager' même si nous n'avons qu'une seule fenêtre modale. La raison d'avoir ce service est l'isolation de vos ViewModels à partir du code complètement lié à View (fenêtres de dialogue). Dans le premier scénario, j'ouvrirais le dialogue en utilisant 'IWindowManager' depuis un ViewModel externe. Disons que c'est un viewModel qui a 'EditCommand'. Cette commande devrait créer 'EditorViewModel' et l'ouvrir dans la boîte de dialogue. – Snowbear

+0

Je considère ceci, mais cela signifierait devoir ajouter encore un autre service dans le ViewModel. Est-ce que ça gonfle avec les services n'est pas un problème?Si je pouvais laisser le conteneur le gérer, cela ne poserait aucun problème, mais le modèle est l'une des choses que j'ajoute, donc je ne peux pas résoudre un conteneur. –

Questions connexes