2010-04-28 4 views
1

Après avoir essayé un certain nombre de solutions différentes, je reviens toujours à cela. J'ai besoin d'un Window.ShowDialog, en utilisant la classe ViewModelLocator comme une usine via un UnityContainer. Fondamentalement, j'ai une vue (et ViewModel) qui sur un bouton sur la vue doit créer une boîte de dialogue (en prenant quelques paramètres dans son constructeur) qui va traiter une logique et éventuellement retourner un résultat à l'appelant (avec les résultats de toute la logique qu'il a calculée). Peut-être que je me trompe pour regarder encore cela d'un point de vue Windows Forms, mais je sais exactement ce que je veux faire et je veux idéalement le faire en utilisant WPF et MVVM. J'essaye de faire fonctionner ceci pour un projet, et finalement je ne veux pas devoir retourner à WPF vanille afin de le faire fonctionner.Dialogues (vrais)

Répondre

0

Vous pouvez le faire. Créez simplement une instance d'une page/usercontrol/window et appelez le instance.ShowDialog().

Here's my T4 templates pour générer un view/viewmodel avec la messagerie pour fermer une fenêtre et d'autres astuces.

2

Je casse les règles pour implémenter une boîte de dialogue mais essaye de la réduire au minimum. J'ai une méthode OpenDialog dans mon BaseViewModel:

public void OpenDialog(DialogViewModel model) 
{ 
    this.MessengerInstance.Send<DialogViewModel, MainWindow>(model); 
} 

Et dans mon MainWindow:

Messenger.Default.Register<DialogViewModel>(this, model => 
     { 
      // Instantiate the dialog box 
      var dlg = new DialogWindow(); 
      // Configure the dialog box 
      dlg.Owner = this; 
      dlg.Content = model; 
      // Open the dialog box modally 
      dlg.ShowDialog(); 
     }); 

De cette façon, j'ai seulement un couplage lâche entre mon viewmodel et mon MainView. Vous pouvez faire la même chose pour la fermeture, mon BaseDialogViewModel a une méthode:

public void CloseDialog() 
    { 
     this.MessengerInstance.Send<PopUpAction, DialogWindow>(PopUpAction.Close); 
    } 

(PopupAction est juste un ENUM) et mon registres DialogWindow pour que:

Messenger.Default.Register<PopUpAction>(this, action => 
     { 
      switch (action) 
      { 
       case PopUpAction.Close: 
        this.Close(); 
        break; 
      } 
     }); 

Vous pouvez également laisser le récepteur loin lors de l'envoi, pour garder la classe vue hors du viewmodel mais de toute façon je pense que c'est une solution acceptable :)

Questions connexes