C# 如何在MVVM中使用DialogService启动多个独立的窗口?
在MVVM方式中,我有一个初始窗口打开(MainView),其DataContext(即其viewmodel)是从后面的代码初始化的: XAML: 从那时起,我使用DialogService从UserControls打开其他窗口: XAML:C# 如何在MVVM中使用DialogService启动多个独立的窗口?,c#,wpf,xaml,mvvm,user-controls,C#,Wpf,Xaml,Mvvm,User Controls,在MVVM方式中,我有一个初始窗口打开(MainView),其DataContext(即其viewmodel)是从后面的代码初始化的: XAML: 从那时起,我使用DialogService从UserControls打开其他窗口: XAML: ViewModel创建WindowDialog和关联的ViewModel并打开窗口 一切都很好 现在问题来了。假设我有十个用户控件。这些用户控件中的每一个都可以由DialogService显示。这些用户控件中的每一个都可以打开其他用户控件 我想做的是让
ViewModel创建WindowDialog和关联的ViewModel并打开窗口
一切都很好
现在问题来了。假设我有十个用户控件。这些用户控件中的每一个都可以由DialogService显示。这些用户控件中的每一个都可以打开其他用户控件
我想做的是让主窗口打开UserControl_1。然后让UserControl_1打开UserControl_2。然后需要关闭UserControl_1,使UserControl_2保持打开状态。当然,UserControl_2可以打开UserControl_3,然后UserControl_2消失,只留下主窗口和UserControl_3。简而言之,每个启动的UserControl都需要独立于创建它的控件
我希望这是可以理解的
如何做到这一点?感谢您的任何想法或帮助。通常您需要在这里实现的是
依赖项注入
,以实现控制反转
模式Unity
是与WPF一起使用的IoC容器的一个很好的例子(建议作为Prism的一部分使用)
依赖项注入容器本质上是一个内存中的容器,用于存储服务对象之类的项,或者用于提供基于接口的实现类,这些接口由您配置(通过代码、配置XML或其他方式)并在运行时解析
各种窗口/用户控件对象的ViewModels
将在构建时注入对DialogService
对象的引用。DialogService
对象可能会在显示相关对话框时维护它们的列表,并且可以根据您编码到其中的调用/逻辑,根据需要协调窗口的显示/关闭
您还可以将DialogService
编码为单例模式,并获得类似的结果,因为Unity样式复合应用程序中使用的许多内存中服务层实现基本上都是通过UnityContainer
执行的单例,您想要做的是.Show()一个新窗口,而不是.ShowDialog()。因此,您应该将代码更改为.Show()。
<Window x:Class="Nova5.UI.Views.MainView" ..............
public partial class MainView : Window
{
private MainViewModel vm = new MainViewModel(new WPFMessageBoxService());
public MainView()
{
InitializeComponent();
this.Loaded += (s, e) => { this.DataContext = this.vm; };
}
}
<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>