试图了解使用服务打开对话框

时间:2015-02-24 21:51:16

标签: c# wpf mvvm

我已经阅读了有关使用mvvm模式打开对话框的讨论。我已经看过几个说使用服务的例子,但我并不了解所有部分是如何组合在一起的。我发布了这个问题,在我应该阅读的内容中寻求指导,以便更好地理解我所缺少的内容。我将发布下面的内容,它确实有效,但从我在这些帖子中看到的内容来看,我做得不对,或者说效率不高。我看到创建对话框界面的位置,然后是使用该界面进行实际工作的类。然后在ViewModel中一个构造函数传递到这个界面,这是让我感到困惑的部分,不确定传递它的是什么,没有足够的信息连接点而不确定我是什么&#39我失踪了。

以下是我看过的一篇文章:https://stackoverflow.com/a/1044304/4593652我看到了他们的建议,但对于某些学习者而言,这些信息并不充分。我不是要求任何人为我写这篇文章,只是希望就我应该阅读的内容提出一些建议,以了解这些内容是如何组合在一起的。

在我的代码中,我有一个这样的课程:(这有效,我只是觉得我错过了我在其他帖子上阅读的内容)

public class OpenDialogService
    {
    public string GetOpenDialog(string title)
    {
        CommonOpenFileDialog dlg = new CommonOpenFileDialog();
        dlg.Title = title;
        dlg.IsFolderPicker = true;
        dlg.AddToMostRecentlyUsedList = true;
        dlg.AllowNonFileSystemItems = false;
        dlg.EnsureFileExists = false;
        dlg.EnsurePathExists = true;
        dlg.EnsureReadOnly = false;
        dlg.EnsureValidNames = true;
        dlg.Multiselect = false;
        dlg.ShowPlacesList = true;

        if (dlg.ShowDialog() == CommonFileDialogResult.Ok)
        {
            return dlg.FileName;
        }
        return null;
    }
}

然后,当我的命令被调用时,我在我的ViewModel中使用它。

path = new OpenDialogService().GetOpenDialog("...");

2 个答案:

答案 0 :(得分:3)

瓦尔特基本上是对的。

另一篇帖子说他可以通过IOC Container改变他的服务实现。 IOC表示"控制反转" -Pattern,您可以阅读this文章以获得基本概述。我认为"服务"也来自那个模式。另一个流行语是你可以寻找的依赖注入。

答案 1 :(得分:2)

好的,这里有几个问题。

正如@ ec8or指出的那样,您应该阅读“控制反转”(IoC),因为几乎所有的MVVM框架都使用它。服务模式也依赖于IoC,因此测试更容易。

代码中缺少的部分是服务的接口,并使用IoC将代码注入ViewModel。

public interface IOpenDialogService
{
    string GetOpenDialog(string title);
}

public class OpenDialogService : IOpenDialogService ...

然后在ViewModel中使用它

public class MyViewModel
{
    private IOpenDialogService openDialogService;

    // service injected by the IoC
    public MyViewModel(IOpenDialogService openDialogService)
    {
        this.openDialogService = openDialogService;
    }

    public void DoCommand()
    {
        var path = openDialogService.GetOpenDialog("...");
    }
}

为什么这样做?

当您测试ViewModel时,您不希望突然弹出对话框,导致测试失败或挂起。因此,在测试期间,我们可以将IOpenDialogService的实现更改为返回常量的内容,例如。然后,当您测试ViewModel而不是打开对话框时,代码将获得常量并继续运行,从而允许测试完成。

这样,您无需修改​​ViewModel代码,只是为了让它在测试期间正常工作。