【问题标题】:Implementing WPF MVVM Dialog Service实现 WPF MVVM 对话服务
【发布时间】:2018-09-19 23:44:33
【问题描述】:

我正在尝试通过 DialogService 实现在应用程序中处理多个视图/窗口的“MVVM 推荐”方式。但是,在显示子视图后,我在实现关闭父视图时遇到了困难。到目前为止,这是我的实现。 WPF MVVM 处理这种情况的最佳策略是什么?

DialogService.cs(我尝试使其通用,以便它可以显示和关闭任何窗口)

public class DialogService : IDialogService
{
    /// <summary>
    /// Closes the specified window screen
    /// </summary>
    /// <param name="dialogWindow"></param>
    public void CloseDialog(Window dialogWindow)
    {
        if ( dialogWindow != null )
            dialogWindow.Close ( );       
    }

    /// <summary>
    /// Shows the specified window screen
    /// </summary>
    /// <param name="dialogWindow"></param>
    public void ShowDialog(Window dialogWindow)
    {
        if ( dialogWindow != null )
            dialogWindow.ShowDialog ( );
    }
}

显示子视图的视图模型是 SelectPackageViewModel.cs

public SelectPackageViewModel(IPackageDataService packageDataService, IDialogService dialogService)
{
    this.packageDataService = packageDataService;
    this.dialogService = dialogService;
    LoadPackages();
    LoadCommands();
}
private void LoadCommands()
{
    CreateNewCommand = new CustomCommand(CreateNewPackage);
}
private void CreateNewPackage(object obj)
{            
    dialogService.ShowDialog(new CreatePackage());            
}

父视图 SelectPackage.cs。子视图是 CreatePackage.cs

<Button Name="btnNewPackage"
    Content="New..."
    HorizontalAlignment="Center"
    Width="120"
    Height="30"
    FontSize="15" FontWeight="Bold"
    Margin="10"
    Command="{Binding CreateNewCommand}"/>

【问题讨论】:

  • MVVM 的“推荐”方式是 ViewModel 对 UI 一无所知。这包括通过偷偷摸摸的对话服务间接进行
  • 研究中介模式以及如何将其应用于 WPF 和 MVVM
  • 在视图模型中创建一个窗口会破坏 MVVM 模式并破坏使用对话服务的全部目的。

标签: c# wpf mvvm


【解决方案1】:

您始终可以使用名为 MvvmDialogs 的 NuGet 包,或查看其实现。毕竟是在 GitHub 上开源的。

友好的建议,请注意有关 MVVM 的绝对答案。这些答案通常来自处于学习阶段的开发人员,他们遵循规则和指南,却不了解它们的好处。随着您的进步,您开始质疑“为什么”,并变得更加务实。视图模型不应该知道视图服务的想法是愚蠢的。它是一个视图模型,视图就是它的名字。

【讨论】:

  • 感谢您的建议!我一定会检查 MvvmDialogs。同时,我发现以下效果很好。 link
  • -1 表示第二个不明智的段落。通过使用服务方法ShowDialog(Window dialogWindow),我的MyApp.ViewModels.dll 现在有了对WPF 程序集的直接依赖(即解析Window)。视图模型组件与表示类型紧密耦合。此外,因为它的设计如此糟糕,是什么阻止了 VM 显示它刚刚通过 CreatePackage 创建的窗口并完全忽略该服务?这将产生级联效应。此建议来自已完成“学习阶段”的开发人员。
  • 您的评论不够具体。您通常指的是所有对话服务,因为您使用“服务”的复数形式。关于 op 实现的对话服务,我同意你的看法,但我不同意你的一般性陈述。如果您重新阅读您的评论,您会发现您根本没有帮助操作员,您只需告诉他或她不要做什么。
  • OP 可能想在鲨鱼出没的水域游泳,因为有人告诉他这都是宣传。如果我告诉他最好在游泳池里游泳,那肯定会“帮助手术”。 QED
  • 没有必要否决我的问题。我只是寻求建议。也许这个问题不适合那些自大的人。
猜你喜欢
  • 1970-01-01
  • 2010-12-12
  • 1970-01-01
  • 1970-01-01
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多