开发者

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!


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


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();
   }
}


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


You can do in this way like you need to create some events and register those in view and call these in view model.and open that pop up window.

Like This example

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");
  } 
}

inside the view

MainView mn = new MainView();

Register the event here like mn.POpUpEvent += then click on tab button double time and in registers popup method write the code for opening the pop up window.


Prism-Event Aggrigator is good approach, where we can create independent module without dependency. first viewmodel will publish event and then another view or view or viewmodel can subscribe that event from event aggrigator.

in this case Unity container can also use to inject one viewmodel in to another with dependency injection.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜