实现 WPF MVVM 对话框服务

3
我正在尝试通过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}"/>

2
MVVM的“推荐”方式是_ViewModels对UI一无所知_。这包括通过隐秘的对话服务进行间接操作。 - user585968
2
研究中介者模式以及如何在WPF和MVVM中应用。 - undefined
1
在视图模型中创建一个窗口会破坏MVVM模式,并且违背使用对话框服务的整个目的。 - undefined
1个回答

6

你可以随时使用名为MvvmDialogs的NuGet包,或查看其实现。毕竟,它在GitHub上是开源的。

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


谢谢你的建议!我一定会去看看MvvmDialogs。与此同时,我找到了以下这个链接,使用起来非常好。 link - undefined
通过使用服务方法ShowDialog(Window dialogWindow),我的MyApp.ViewModels.dll现在对WPF程序集有一个直接依赖关系(即解析Window)。视图模型程序集与呈现类型存在紧密耦合。此外,由于这是一个糟糕的设计,阻止VM通过CreatePackage显示它刚创建的窗口并完全忽略该服务的是什么?这将产生级联效应。此建议来自一位已经完成了他的_"学习阶段"_的开发人员。 - user585968
你在评论中没有提供足够的具体信息。你用了“服务”的复数形式,泛指所有对话服务。关于op实现的对话服务,我同意你的看法,但我不同意你的总体陈述。如果你重新阅读自己的评论,你会发现你并没有帮助op,只是告诉他或她不应该做什么。 - undefined
OP可能想在鲨鱼满布的水域里游泳,因为有人告诉他那只是宣传的说辞。如果我告诉他最好去游泳池里游泳,那肯定会“帮助他”。证毕。 - user585968
3
没有必要对我的问题投反对票。我只是寻求建议。也许这个问题不适合那些自负的人。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接