【问题标题】:How to launch multiple independent windows using a DialogService in MVVM?如何在 MVVM 中使用 DialogService 启动多个独立窗口?
【发布时间】:2014-11-18 03:14:10
【问题描述】:

在 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> 

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

一切都好。

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

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

我希望这是可以理解的。

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

【问题讨论】:

  • 你想做的是 .Show() 一个新窗口,而不是 .ShowDialog()。所以你应该把你的代码改成 .Show()。

标签: c# wpf xaml mvvm user-controls


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2011-03-13
    • 1970-01-01
    • 2015-05-25
    • 2019-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多