【问题标题】:How can I create new instance of window from ViewModel with Unity?如何使用 Unity 从 ViewModel 创建新的窗口实例?
【发布时间】:2016-11-01 04:08:47
【问题描述】:

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

在视图中添加了Unity 的引用,我正在使用Unity 将我的MainWindowViewModel 实例注入到应用程序的StartUp 上的MainWindow 视图中,并且能够将视图模型绑定到视图。

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

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

已经尝试过以下方法:

编辑:

回复Wills questions

  1. 我想在没有任何插件或插件的情况下实现这一点,因为我不熟悉其中的任何一个,而且大多数答案都涉及一些插件。另外,我觉得如果我自己让它工作,让我完全控制它,这对我来说真的很方便。
  2. 我尝试了this,但无法正常工作。此外,还不清楚我必须把什么放在哪里(在视图中或 vm 中)
  3. 我不想开多个MainWindow,这只是另一个工作的研发。在实际场景中,我们需要显示与系统连接的某些设备的状态,并且每个连接的设备都会有单独的Window。即使我们可以从Mainwindow 打开多个子窗口,我也可以。
  4. 我只想用不同的数据上下文实例打开多个窗口实例,它可以来自视图或虚拟机,但它应该保持 MVVM。

【问题讨论】:

  • 让我知道任何其他详细信息。 .
  • 您不能在视图模型中创建窗口。那不是 MVVM。第二个问题的公认答案很糟糕。这个答案stackoverflow.com/a/2349193/1228 更好。一些以 UI 为中心的中介应该为 vm 工作 UI。这样你就可以在测试中把它存根。您可以在 edit 中提供的另外两个信息是 1)为什么这两个问题没有提供答案,以及 2)为什么需要从视图模型打开一个新的主窗口(两个 i> 主窗口?奇怪!)

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


【解决方案1】:

这就是我以前的做法:

有一个导航的中心位置。可能是 App.xaml.cs 或者您可以拥有自己的。在这个类中,您将拥有您的 IoC 容器并控制窗口。

然后,您可以使用 Messenger 系统在 ViewModel 和 ViewModel 之间与应用程序进行通信。 MVVM Light Toolkit 有一个轻量级模型。还有其他 MVVM 框架/工具。 PRISM 是 Microsoft 自己的,但一开始可能会很复杂。在 PRISM 中,这种消息传递机制称为 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());
     }
}

大致了解它的工作原理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多