如何在 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。简而言之,每个启动的用户控件都需要独立于创建它的控件。
我希望这是可以理解的。
如何做到这一点? 感谢您的任何想法或帮助。
您需要在此处实现的是实现Inversion of Control
模式Dependency Injection
。 Unity
是与 WPF 一起使用的 IoC 容器的一个很好的例子(建议作为 Prism 的一部分)。
依赖关系注入容器本质上是一个内存中的容器,用于存储服务对象等项,或者用于提供基于您配置(通过代码或配置 XML 或其他方式)并在运行时解析的接口的实现类。
各种窗口/用户控件对象的ViewModels
将在构造时注入对DialogService
对象的引用。DialogService
对象可能会在显示时维护相关对话框的列表,并可以根据您编码到其中的调用/逻辑根据需要协调 Windows 的显示/关闭。
您还可以将DialogService
编码为单例模式,并获得类似的结果,因为 Unity 样式复合应用程序中使用的许多内存中服务层实现本质上是通过UnityContainer
强制执行的单例。