47 votes

Comment avez-vous implémenté avec succès la fonctionnalité MessageBox.Show () dans MVVM?

J'ai une application WPF qui appelle MessageBox.Show() chemin du retour dans le ViewModel (pour vérifier si l'utilisateur veut vraiment supprimer). Cela fonctionne, mais va à l'encontre de MVVM depuis le ViewModel ne devrait pas explicitement de déterminer ce qui se passe sur l'Affichage.

Alors maintenant, je pense à comment puis-je mieux de mettre en œuvre la MessageBox.Show() fonctionnalité dans mon application MVVM, options:

  1. Je pourrais avoir un message avec le texte "Êtes-vous sûr que...?" avec deux boutons Oui et Non, le tout dans une Bordure dans mon XAML, et de créer un déclencheur sur le modèle de sorte qu'il est effondrée/visible basé sur un ViewModelProperty appelé AreYourSureDialogueBoxIsVisible, et puis quand j'ai besoin de cette boîte de dialogue affecter AreYourSureDialogueBoxIsVisible à "true", et également de gérer les deux boutons via DelegateCommand de retour dans mon ViewModel.

  2. Je pourrais aussi en quelque sorte essayer de gérer cela avec des déclencheurs dans le code XAML de sorte que le bouton Supprimer en fait tout à fait de certains élément de Frontière apparaît avec le message et les boutons, et le bouton Oui ne le fait la suppression.

Les deux solutions semblent être trop complexe pour un couple de lignes de code avec MessageBox.Show().

De quelles façons avez-vous mis en œuvre avec succès des Boîtes de Dialogue dans vos applications MVVM?

16voto

Dean Chalk Points 161

pourquoi ne pas faire quelque chose de vraiment simple avec Action <> et Func <> http://www.deanchalk.me.uk/2013/04/wpf-mvvm-simple-messageboxshow-with.html

14voto

wekempf Points 2168

Services à la rescousse. Utiliser Onyx (disclaimer, je suis l'auteur) est aussi simple que:

 public void Foo()
{
    IDisplayMessage dm = this.View.GetService<IDisplayMessage>();
    dm.Show("Hello, world!");
}
 

Dans une application en cours d'exécution, cela appellera indirectement MessageBox.Show ("Hello, world!"). Lors du test, le service IDisplayMessage peut être simulé et fourni au ViewModel afin de faire tout ce que vous voulez accomplir pendant le test.

5voto

Aaron Hoffman Points 2696

Des deux que vous mentionnez, je préfère l'option n ° 2. Le bouton Supprimer sur la page juste fait le "Dialogue Confirmer la Suppression" apparaissent. Le "Dialogue Confirmer la Suppression" en fait, les coups de pied au large de la Supprimer.

Avez-vous vérifié Karl Shifflett de WPF Ligne D'Affaires, des Diapositives et des Démos? Je sais qu'il fait quelque chose comme cela. Je vais essayer de me souvenir d'où:

http://karlshifflett.wordpress.com/2009/06/17/chicago-wpf-lob-tour-materials-new-materials-added/

EDIT: découvrez la Démo N ° 11 "la Validation des Données dans MVVM" (EditContactItemsControlSelectionviewmodel.DeleteCommand). Karl appelle une fenêtre du ViewModal (Quoi!? :-). En fait, j'aime votre idée de mieux. Il semble plus facile de Test de l'Unité.

3voto

SoMoS Points 7082

Qu'en est-il de la création d'un événement tel que "MessageBoxRequested" géré dans le codebehind de la vue (de toute façon, il s'agit d'un code uniquement pour que je ne vois aucun problème à avoir ce code sur le codebehind).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X