WPF MVVM从VIEW MODEL获取父项

在MVVM WPF应用程序中。

你如何从ViewModel设置第二个窗口父项?

例:

view1 - viewModel1

viewModel1的命令调用:

var view2 = new view2

view2.Owner = <----这是问题区域。 我如何从viewModel获得view1作为所有者?

view2.Show()

编辑:

请参阅下面的接受答案,然后阅读以下编辑。

我使用MVVM光 - > http://mvvmlight.codeplex.com/(真棒顺便说一句)

内置的消息传递系统非常棒。 我现在正在从视图模式向我的视图发送消息,告诉它显示另一个窗口。

对于目前在主视图中使用带有switch语句的字符串的消息来确定要打开的视图; 但是我可能会修改也是MVVM光工具包的一部分的标记。

谢谢!


在我看来,打开一个新窗口是View的责任,而不是ViewModel的责任。 就我个人而言,我将使用与用于显示对话框相同的方法(这已在此论坛中讨论过):

让ViewModel向View发送消息,请求它打开一个新窗口。 (或者)使用一个IDialogService或者你想调用它的任何你传递给ViewModel的构造函数的东西。 该服务将负责打开窗口(或将此任务委派给视图)。 通过这种方式,您可以保持对问题的清晰分离,并且您的虚拟机保持可测试状态(您可以单元测试已发送打开新的Wndow的请求,但无法测试窗口确实已打开)。

那有意义吗?

干杯,

洛朗


从你的viewmodel调用

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

并且从视图的代码隐藏( 调用第二个视图的视图 )可以很容易地在构造函数中编写它:

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

并且在视图的代码隐藏中写下这个方法:

private void ReplyToMessage(NotificationMessage msg)
{
   if (msg.Notification == "Open Window")
   {
      SecondWindow win = new SecondWindow();
      win.ShowDialog();
   }
}

我没有自己的答案,但这里有几个链接,我最近一直在寻找可能有帮助的东西。 我也会对其他人的建议感兴趣。

据我所知,关键是,如果可能的话,您不应该从视图模型中创建视图 ,因此您需要一种以松散耦合的方式传达您需要的方式。

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

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

使用MVVM处理WPF中的对话框

链接地址: http://www.djcxy.com/p/56169.html

上一篇: WPF MVVM Get Parent from VIEW MODEL

下一篇: WPF+MVVM: How to use plain old ViewModelBase when DependencyProperty is needed