繁体   English   中英

使用WPF PRISM MVVM打开CommonOpenFileDialog

[英]Opening CommonOpenFileDialog using WPF PRISM MVVM

我一直在阅读使用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;


    }
}

最MVVMy的方法是让你注入你的VM的SystemDialogService,它有一个方法GetOpenFileDialogPath或其他东西,它完全符合你的代码所做的。

这样,您可以在单元测试中轻松模拟它并在其他VM中重复使用它。

此外,有一个代码背后不是一个坏事!

因此,您通过在最后添加Service重命名您的类,为它提取接口并使用您使用的任何依赖注入表单将其注入VM构造函数中。

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

var path = _systemDialogService.SelectFolder() - 就是这样

几年前,我写了一篇相当详细的文章,展示了如何使用数据绑定来创建纯MVVM对话框,您可能想要查看示例项目。 除了常见的系统对话框之外,它还适用于第三方对话框库。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM