Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

WPF MVVM Get Parent from VIEW MODEL

In a MVVM WPF application.

How do you set a second windows parent from the ViewModel?

example:

view1 -- viewModel1

viewModel1's command calls:

var view2 = new view2

view2.Owner = <----This is the problem area. How do I get view1 as the owner here from the viewModel?

view2.Show()

EDIT:

See accepted answer below, then read the following edit.

I'am using MVVM light -> http://mvvmlight.codeplex.com/ (awesome btw)

The baked-in messaging system is great. I am now sending a message from the viewmodel to my view telling it to show another window.

For the message I'am currently using a string with a switch statement in the main view to determine what view to open; however I may tinker with the tokens that also are part of MVVM light toolkit.

Thank you!

like image 693
dnndeveloper Avatar asked May 03 '10 20:05

dnndeveloper


3 Answers

In my opinion, opening a new window is the responsibility of the View, not of the ViewModel. Personally, I would use the same approach as used for displaying a dialog box (this was discussed in this forum already):

Have the ViewModel send a Message to the View requesting that it opens a new Window. (alternatively) use an IDialogService or whatever you want to call it which you pass to the ViewModel's constructor. This service will be in charge of opening the Window (or of delegating this task to the View). This way, you keep a clean separation of concerns and your VM remains testable (you can unit test that the request to open the new WIndow has been sent, but you couldn't test that the window has been, indeed, open).

Does that make sense?

Cheers,

Laurent

like image 61
LBugnion Avatar answered Nov 18 '22 03:11

LBugnion


From your viewmodel call

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

And from your view's codebehind (a view that call the second view) easily write this in the constructor:

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

And also write this method in the view's codebehind:

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}
like image 8
Mohammad Zare Avatar answered Nov 18 '22 05:11

Mohammad Zare


I don't have an answer of my own but here's a few links to things I've been looking at lately that might help. I'll also be interested in anything others suggest.

As I understand it, the key thing is, you shouldn't be creating Views from within a View Model if possible, so you need a means of communicating what you need in a loosely coupled fashion.

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

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

Handling Dialogs in WPF with MVVM

like image 1
Grokodile Avatar answered Nov 18 '22 04:11

Grokodile