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