22

在 MVVM WPF 应用程序中。

你如何设置第二个 Windows 父级ViewModel

例子:

view1--viewModel1

viewModel1的命令调用:

var view2 = new view2

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

view2.Show()

编辑:

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

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

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

对于消息,我目前在主视图中使用带有 switch 语句的字符串来确定要打开的视图;但是,我可能会修改也属于 MVVM 轻量级工具包的令牌。

谢谢!

4

5 回答 5

25

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

让 ViewModel 向 View 发送一条消息,请求它打开一个新窗口。(或者)使用 IDialogService 或任何你想调用它的东西,你传递给 ViewModel 的构造函数。该服务将负责打开窗口(或将此任务委托给视图)。这样,您可以保持关注点的清晰分离,并且您的 VM 仍然可测试(您可以对打开新窗口的请求进行单元测试,但您无法测试窗口是否已经打开)。

那有意义吗?

干杯,

洛朗

于 2010-05-03T23:26:32.913 回答
8

从您的视图模型调用

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();
   }
}
于 2011-09-15T04:59:41.820 回答
1

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

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

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

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

使用 MVVM 处理 WPF 中的对话框

于 2010-05-03T21:20:32.657 回答
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 +=然后单击两次选项卡按钮,然后在注册弹出方法中编写打开弹出窗口的代码。

于 2010-11-23T05:36:46.940 回答
0

Prism-Event Aggrigator 是一个很好的方法,我们可以在其中创建没有依赖关系的独立模块。第一个视图模型将发布事件,然后另一个视图或视图或视图模型可以从事件聚合器订阅该事件。

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

于 2013-02-18T11:30:24.090 回答