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

时间:2014-11-18 03:14:11

标签: c# wpf xaml mvvm user-controls

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

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> 

ViewModel创建WindowDialog和关联的viewmodel并打开窗口。

一切都很好。

现在问题。可以说我有十个用户控件。 DialogService可以显示每个UserControl。这些UserControl中的每一个都可以打开其他UserControl。

我想要做的是让MainWindow打开UserControl_1。然后让UserControl_1打开UserControl_2。然后UserControl_1需要关闭,打开UserControl_2。当然,UserControl_2可以打开UserControl_3,之后UserControl_2消失,只留下MainWindow和UserControl_3。简而言之,每个启动的UserControl都需要独立于创建它的控件。

我希望这是可以理解的。

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

1 个答案:

答案 0 :(得分:1)

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

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

各种Window / Usercontrol对象的ViewModels将在构造时注入DialogService对象的引用。 DialogService对象可能正在显示相关对话框的列表,并且可以根据您编入其中的调用/逻辑,根据需要协调显示/关闭Windows。

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