我已经阅读了有关使用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("...");
答案 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代码,只是为了让它在测试期间正常工作。