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

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

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

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

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

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

已经尝试过以下方法:

  • Opening new window in MVVM WPF
  • The best approach to create new window in WPF using MVVM

  • 编辑:

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

    这就是我以前的做法:

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

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

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

    搜多代码:

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

    大致了解它是如何工作的。

    关于c# - 如何使用 Unity 从 ViewModel 创建新的窗口实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38099788/

    相关文章:

    c# - WPF 中的显示对话框

    mvvm - 使用 ViewModel 代替 DTO 作为 CQRS 查询的结果

    c# - 如何显示 DataAnnotations 的错误消息

    在 kotlin 中为 recyclerview 实现 MVVM 设计模式

    c# - "x.OnSpeak += (s, e)"是什么意思?

    c# - 为什么DataGrid调用集合的IndexOf传递类型ItemcControl.ItemInfo的对象?

    c# - 这个 C# 操作方法代码实际上触发了 301 重定向吗?

    c# - 更有效地实现大量事件

    c# - Linq.Where(x=>x==1) - 编译器在做什么

    c# - AutoResetEvent 和多个 Set