使用WPF PRISM MVVM打开CommonOpenFileDialog

时间:2019-05-02 09:20:31

标签: c# wpf mvvm prism

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


    }
}

2 个答案:

答案 0 :(得分:0)

最MVVMy的方法是将一个SystemDialogService注入到VM中,该SystemDialogService具有方法GetOpenFileDialogPath或类似功能的代码,完全可以实现您的代码。

这样,您可以轻松地在单元测试中对其进行模拟,并在其他VM中重新使用。

此外,在后面还没有代码!

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

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

var path = _systemDialogService.SelectFolder()-仅此

答案 1 :(得分:0)

几年前,我写了a fairly detailed article,展示了如何进行具有数据绑定功能的纯MVVM对话框,您可能想查看示例项目。除了常见的系统对话框外,它还可以与第三方对话库一起很​​好地工作。

实际上,我可能会很快对其进行更新,因为我最近实现了自定义WPF对话框(任意形状等),这些对话框很相似,但您需要注意一些怪癖。