[英]Should I put this function in View (code-behind) or in ViewModel?
我正在创建一个简单的WPF应用程序。 我有一个函数OpenFile:
private void OpenFile(string fileName)
{
if(!File.Exists(Helper.GetPath(fileName)))
{
MessageBox.Show("Error opening file");
}
else
{
//Code to handle file opening
}
}
理想情况下,此功能应存在于何处? 我觉得它应该在.xaml.cs
因为它访问View
部分中的MessageBox。 但它也称我的助手为模型中的助手。 所以我也认为它可以在ViewModel
。 在View
或ViewModel
中使用它有什么好处? 有人可以帮我提一些指示吗?
谢谢。
将其置于视图模型中的一个优点是可测试性。 您可以编写单元测试,检查是否仅在文件存在时才显示消息框(如果您正在访问文件系统,则更准确地说,它将是集成测试)。
但是,由于您直接使用消息框,因此在构建服务器上永远不会完成测试,因为在显示消息框时,计算机将等待用户的输入。
因此,我会在视图模型中反对抽象,以便您可以在测试期间模拟消息框 。
此函数必须位于ViewModel中。 您需要在视图中创建一个操作来显示错误消息并调用此方法而不是MessageBox.Show
。 显示消息框需要在View
完成。
通常,您应该避免在View
实现任何业务逻辑,例如验证或处理文件。
如果您使用的是Microsoft Prism,则可以使用IInteractionRequest
接口让视图创建MessageBox
,但实际上会将必要的响应传递给视图模型。
如果您不使用Microsoft Prism,那么请查看此部分的工作原理,并模拟它或使用类似的框架。
基本上,该代码应该在您的视图模型上进行测试,但是替换显式调用MessageBox的行并使用提到的IInteractionRequest
。
以下是与您要实现的方案相关的文档: 第6章:高级MVVM方案 。 . 请查看 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.