WPF MVVM Get Parent from VIEW MODEL

Dans une application WPF MVVM.

comment configurer un second parent windows à partir du ViewModel ?

exemple:

view1 -- viewModel1

viewModel1 's de commande s'appelle:

var view2 = new view2

view2.Owner = <----C'est le problème. Comment puis-je obtenir view1 en tant que propriétaire ici à partir du viewModel ?

view2.Show()

EDIT:

voir réponse acceptée ci-dessous, puis lire l'édition suivante.

je suis en utilisant MVVM light -> http://mvvmlight.codeplex.com/ (génial d'ailleurs)

La boulangerie de système de messagerie est grande. J'envoie maintenant un message du modèle de vue à ma vue lui disant d'afficher une autre fenêtre.

pour le message je suis en train d'utiliser une chaîne avec une instruction de commutation dans la vue principale pour déterminer quelle vue ouvrir; cependant je peux bricoler avec les jetons qui font aussi partie de MVVM light toolkit.

Merci!

21
demandé sur Andrey Gordeev 2010-05-04 00:59:39

5 réponses

à mon avis, ouvrir une nouvelle fenêtre est la responsabilité de la vue, pas du modèle de vue. Personnellement, j'utiliserais la même approche que celle utilisée pour afficher une boîte de dialogue (cela a déjà été discuté dans ce forum):

faire envoyer un Message à la vue demandant qu'elle ouvre une nouvelle fenêtre. (alternativement) utilisez un IDialogService ou ce que vous voulez l'appeler que vous passez au constructeur du ViewModel. Ce service sera en charge de ouvrir la fenêtre (ou de déléguer cette tâche à la vue). De cette façon, vous gardez une séparation claire des préoccupations et votre VM reste testable (vous pouvez tester que la demande d'ouverture de la nouvelle fenêtre a été envoyée, mais vous ne pouvez pas tester que la fenêtre a été, en effet, ouverte).

ça a du sens?

Cheers,

Laurent

25
répondu LBugnion 2010-05-03 23:26:32

de votre appel de modèle de vue

Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));

et de votre point de vue codebehind ( une vue qui appellent le second voir ) écrire facilement ceci dans le constructeur:

Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);

et aussi écrire cette méthode dans le codebehind de la vue:

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}
7
répondu Mohammad Zare 2011-09-15 04:59:41

Je n'ai pas de réponse, mais voici quelques liens vers des choses que j'ai observé récemment qui pourraient aider. Je m'intéresserai aussi à tout ce que d'autres suggéreront.

comme je l'ai compris, la chose clé est, vous ne devrait pas être la création de vues à partir d'un modèle de vue si possible, donc vous avez besoin d'un moyen de communiquer ce dont vous avez besoin d'une manière librement couplée.

http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx

Dialogues de manipulation dans WPF avec MVVM

1
répondu Grokodile 2017-05-23 12:10:11

vous pouvez faire de cette façon comme vous avez besoin de créer quelques événements et enregistrer ceux en vue et appeler ceux-ci en vue Modèle.et ouvrir cette fenêtre pop-up.

comme cet exemple

public class Mainclass : MainView
{
  public delegate abc RegisterPopUp(abc A);
  public RegisterPopUp POpUpEvent;

  public RelayCommand ShowCommand { private set; get; }  

  public void ShowCommand() 
  { 
    ShowCommand("Your parameter");
  } 
}

à l'intérieur de la vue

MainView mn = new MainView();

enregistrez l'événement ici comme mn.POpUpEvent += puis cliquez sur le bouton tab double temps et dans la méthode Popup registers, écrivez le code pour ouvrir la fenêtre pop up.

0
répondu Hoshiyar 2012-12-06 15:37:10

Prism-Événement Aggrigator est une bonne approche, où l'on peut créer de module indépendant sans dépendance. d'abord viewmodel publiera l'événement et ensuite une autre vue ou une autre vue ou viewmodel pourra souscrire cet événement à partir de event aggrigator.

dans ce cas Unity conteneur peut également utiliser pour injecter un modèle de vue à un autre avec l'injection de dépendance.

0
répondu Jitendra 2013-02-18 11:30:24