如何使用Unity从ViewModel创建新的窗口实例?

时间:2016-06-29 12:37:15

标签: c# wpf mvvm dependency-injection unity-container

我使用WPF应用程序并使用MVVM模式。我有两个独立的视图和视图模型项目。

在视图中添加了对Unity的引用,并且我正在使用UnityMainWindowViewModel的{​​{1}}实例注入到应用的MainWindow上绑定viewmodel以查看。

现在,我想点击StartUp视图上的按钮打开MainWindow的新实例。

问题是如何从Viewmodel创建视图实例。

已经尝试过以下内容:

修改

回答Wills questions

  1. 我想在没有任何插件或插件的情况下实现这一点,因为我不熟悉任何这些和大多数引用一些插件的答案。另外,我觉得如果我自己工作让我完全控制它,对我来说真的很方便。
  2. 我尝试this但无法使其正常工作。此外,我不清楚我必须放置什么(在视图或vm)
  3. 我不想打开多个MainWindow,这只是另一项工作的R& D.在实际情况中,我们需要显示与系统连接的某些设备的状态,并且每个连接的设备将单独MainWindow。即使如果我们可以从Window打开多个子窗口,我也可以。
  4. 我只想用不同的datacontext实例打开多个窗口实例,它可以是view或vm,但它应该维护MVVM。

1 个答案:

答案 0 :(得分:0)

我就是这样做的:

拥有导航的中心位置。可以是App.xaml.cs,也可以让你拥有。在这个类中,您将拥有IoC容器并控制Window。

然后,您可以使用Messenger系统在ViewModel和ViewModels之间与应用程序进行通信。 MVVM Light Toolkit有一个轻量级的模型。还有其他MVVM框架/工具。 PRISM是微软自己的,但开始时可能很复杂。在PRISM中,这种Messenging机制称为EventAggregator。

ViewModel应该有ICommand来处理按钮单击(请参阅MVVM Light Toolkit中的RelayCommands)。该命令发送应用程序正在侦听的消息并打开一个新窗口。

Soudo代码:

public class App
{
     public void InitializeMessengerHooks()
     {
          messenger.Subscribe(typeof(OpenWindowMessage), m => OpenWindow());
     }
}

public class ViewModel
{
     public void OpenWindow()
     {
          messenger.Send(new OpenWindowMessage());
     }
}

关于它是如何工作的粗略想法。