Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在MVVM中使用DialogService启动多个独立的窗口?_C#_Wpf_Xaml_Mvvm_User Controls - Fatal编程技术网

C# 如何在MVVM中使用DialogService启动多个独立的窗口?

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显示。这些用户控件中的每一个都可以打开其他用户控件 我想做的是让

在MVVM方式中,我有一个初始窗口打开(MainView),其DataContext(即其viewmodel)是从后面的代码初始化的:

XAML:

从那时起,我使用DialogService从UserControls打开其他窗口:

XAML:


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>