【问题标题】:Opening CommonOpenFileDialog using WPF PRISM MVVM使用 WPF PRISM MVVM 打开 CommonOpenFileDialog
【发布时间】:2019-09-20 18:56:32
【问题描述】:

我一直在阅读有关使用 PRISM 打开对话框并以 MVVM 方式打开对话框的最佳方法,但是到目前为止我发现的似乎只适用于自定义对话框。我希望能够在单击按钮时打开 CommonOpenFileDialog,但我很困惑如何在遵守 MVVM 模式的同时做到这一点。

我可以使用后面的代码来完成此操作,但如果可能的话我想避免这种情况,但我在这里遇到的问题是如何将对话结果从后面的代码传递给视图模型。在这里可以接受 EventAggregator 吗?

这是我的 SelectFolderDialog 类,它打开了对话框。这目前是从我后面的视图代码中调用的:

public class SelectFolderDialog
{

    public string SelectFolder()
    {

        var folderSelectorDialog = new CommonOpenFileDialog();
        folderSelectorDialog.EnsureReadOnly = true;
        folderSelectorDialog.IsFolderPicker = true;
        folderSelectorDialog.AllowNonFileSystemItems = false;
        folderSelectorDialog.Multiselect = false;
        folderSelectorDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        folderSelectorDialog.Title = "Select Folder";
        folderSelectorDialog.ShowDialog();

        string SelectedFolderPath = folderSelectorDialog.FileName;
        Console.WriteLine(SelectedFolderPath);

        return SelectedFolderPath;


    }
}

【问题讨论】:

    标签: c# wpf mvvm prism


    【解决方案1】:

    几年前,我写了a fairly detailed article,展示了如何使用数据绑定进行纯 MVVM 对话框,您可能想查看示例项目。除了常见的系统对话框外,它还可以与 3rd 方对话框库一起正常工作。

    实际上我可能很快就会更新它,因为我最近实现了自定义 WPF 对话框(任意形状等),它们相似但有一些你必须注意的怪癖。

    【讨论】:

      【解决方案2】:

      最 MVVMy 的方法是拥有一个 SystemDialogService 注入到你的 VM 中,它有一个方法 GetOpenFileDialogPath 或其他东西,它完全可以完成你的代码。

      这样您就可以轻松地在单元测试中模拟它并在其他虚拟机中重用它。

      另外,后面有代码并不是一件坏事!

      因此,您可以通过在末尾添加 Service 来重命名您的类,为其提取一个接口并使用您使用的任何依赖注入形式将其注入 VM 构造函数。

      然后在您的按钮单击命令中,您可以执行以下操作:

      var path = _systemDialogService.SelectFolder() - 仅此而已

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-04-16
        • 1970-01-01
        • 2012-02-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多