实现 WPF MVVM 对话服务

Cas*_*ian 3 c# wpf mvvm

我正在尝试实现“MVVM 推荐”方式,通过 DialogService 处理应用程序中的多个视图/窗口。但是,我在显示子视图后实现关闭父视图时遇到了困难。到目前为止,这是我的实现。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 ( );
    }
}
Run Code Online (Sandbox Code Playgroud)

显示子视图的视图模型是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());            
}
Run Code Online (Sandbox Code Playgroud)

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

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

Fan*_*sco 6

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

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

  • 没有必要否决我的问题。我只是寻求建议。也许这个问题不适合那些自我膨胀的人。 (3认同)