如何在 MVVM 中使用对话服务启动多个独立窗口

本文关键字:启动 服务 窗口 独立 对话 MVVM | 更新日期: 2023-09-27 18:30:47

在MVVM方式中,我有一个初始窗口打开(MainView),其DataContext(即其视图模型)从代码隐藏初始化:

XAML:

<Window x:Class="Nova5.UI.Views.MainView"    ..............

代码隐藏 C#:

public partial class MainView : Window
{
    private MainViewModel vm = new MainViewModel(new WPFMessageBoxService());
    public MainView()
    {
        InitializeComponent();
        this.Loaded += (s, e) => { this.DataContext = this.vm; };
    }

}

从那里开始,我使用DialogService从UserControls打开其他窗口:

XAML:

<Window x:Class="Nova5.UI.Views.WindowDialog"
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            Title="WindowDialog" 
            WindowStyle="SingleBorderWindow" 
            WindowStartupLocation="Manual" SizeToContent="WidthAndHeight">
    <ContentPresenter x:Name="DialogPresenter" Content="{Binding .}"/>
</Window> 
视图模型

创建窗口对话框和关联的视图模型并打开窗口。

一切都很好。

现在问题来了。假设我有十个用户控件。这些用户控件中的每一个都可以由对话服务呈现。这些用户控件中的每一个都可以打开其他用户控件。

我想做的是打开主窗口UserControl_1。然后打开UserControl_1 UserControl_2。然后,UserControl_1需要关闭UserControl_2保持打开状态。当然,UserControl_2可以打开UserControl_3之后UserControl_2消失,只留下主窗口和UserControl_3。简而言之,每个启动的用户控件都需要独立于创建它的控件。

我希望这是可以理解的。

如何做到这一点? 感谢您的任何想法或帮助。

如何在 MVVM 中使用对话服务启动多个独立窗口

通常,

您需要在此处实现的是实现Inversion of Control模式Dependency InjectionUnity 是与 WPF 一起使用的 IoC 容器的一个很好的例子(建议作为 Prism 的一部分)。

依赖关系注入容器本质上是一个内存中的容器,用于存储服务对象等项,或者用于提供基于您配置(通过代码或配置 XML 或其他方式)并在运行时解析的接口的实现类。

各种窗口/用户控件对象的ViewModels将在构造时注入对DialogService对象的引用。DialogService对象可能会在显示时维护相关对话框的列表,并可以根据您编码到其中的调用/逻辑根据需要协调 Windows 的显示/关闭。

您还可以将DialogService编码为单例模式,并获得类似的结果,因为 Unity 样式复合应用程序中使用的许多内存中服务层实现本质上是通过UnityContainer强制执行的单例。