在MVVM WPF应用程序中。
如何从ViewModel
设置第二个Windows父级?
示例:
view1
- viewModel1
viewModel1
的命令调用:
var view2 = new view2
view2.Owner
=< ----这是问题所在。如何从viewModel
?
view2.Show()
修改
请参阅下面接受的答案,然后阅读以下编辑内容。
我正在使用MVVM灯 - > http://mvvmlight.codeplex.com/(太棒了)
烘焙消息传递系统很棒。我现在正在从viewmodel向我的视图发送一条消息,告诉它显示另一个窗口。
对于消息我当前在主视图中使用带有switch语句的字符串来确定要打开的视图;但是我可能会修改也是MVVM light toolkit一部分的令牌。
谢谢!
答案 0 :(得分:25)
在我看来,打开一个新窗口是View的责任,而不是ViewModel的责任。就个人而言,我会使用与显示对话框相同的方法(这已在本论坛中讨论过):
让ViewModel向View发送消息,请求它打开一个新窗口。 (或者)使用IDialogService或您要传递给ViewModel构造函数的任何名称。此服务将负责打开窗口(或将此任务委派给View)。 通过这种方式,您可以保持关注点的清晰分离,并且您的VM仍然可以测试(您可以单元测试打开新WIndow的请求是否已发送,但您无法测试该窗口是否确实已打开)。 / p>
这有意义吗?
干杯,
劳伦
答案 1 :(得分:7)
从您的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();
}
}
答案 2 :(得分:1)
我没有自己的答案,但这里有一些我最近一直在寻找可能会有所帮助的事情的链接。我也会对其他人的建议感兴趣。
据我所知,关键是,如果可能,你不应该在视图模型中创建视图,所以你需要一种以松散耦合的方式传达你需要的东西的方法
http://www.codeproject.com/KB/WPF/XAMLDialog.aspx
http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx
答案 3 :(得分:0)
您可以这样做,就像您需要创建一些事件并在视图中注册这些事件并在视图模型中调用它们。并打开该弹出窗口。
喜欢这个例子
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 +=
,然后单击选项卡按钮两次,并在寄存器弹出窗口中编写用于打开弹出窗口的代码。
答案 4 :(得分:0)
Prism-Event Aggrigator是一种很好的方法,我们可以在没有依赖的情况下创建独立的模块。第一个viewmodel将发布事件,然后另一个视图或视图或viewmodel可以从事件aggrigator订阅该事件。
在这种情况下,Unity容器还可以使用依赖注入将一个视图模型注入到另一个视图模型中。