WPF MVVM从VIEW MODEL获取父级

在MVVM WPF应用程序中。

如何从ViewModel设置第二个Windows父级?

例:

view1viewModel1

viewModel1的命令调用:

 var view2 = new view2 

view2.Owner = <—-这是问题所在。 如何从viewModel获取view1作为所有者?

 view2.Show() 

编辑:

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

我正在使用MVVM灯 – > http://mvvmlight.codeplex.com/ (真棒顺便说一句)

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

对于消息我当前在主视图中使用带有switch语句的字符串来确定要打开的视图; 但是我可能会修改也是MVVM light toolkit一部分的令牌。

谢谢!

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

让ViewModel向View发送一条消息,请求它打开一个新窗口。 (或者)使用IDialogService或您想要调用它的任何内容,并传递给ViewModel的构造函数。 该服务将负责打开窗口(或将此任务委派给View)。 通过这种方式,您可以保持关注点的清晰分离,并且您的VM仍然可以测试(您可以unit testing打开新WIndow的请求是否已发送,但您无法测试窗口是否确实已打开)。

那有意义吗?

干杯,

洛朗

从您的viewmodel调用

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

从您的视图的代码隐藏( 调用第二个视图的视图 )轻松地在构造函数中写入:

 Messenger.Default.Register(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中的对话框

您可以这样做,就像您需要创建一些事件并在视图中注册它们并在视图模型中调用它们。并打开该弹出窗口。

像这个例子

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

在视图内

 MainView mn = new MainView(); 

在这里注册事件,如mn.POpUpEvent +=然后单击选项卡按钮两次,并在寄存器弹出方法中编写用于打开弹出窗口的代码。

Prism-Event Aggrigator是一种很好的方法,我们可以在没有依赖的情况下创建独立的模块。 第一个viewmodel将发布事件,然后另一个视图或视图或viewmodel可以从事件aggrigator订阅该事件。

在这种情况下,Unity容器还可以使用dependency injection将一个视图模型注入到另一个视图模型中。