2012-03-04 79 views
6

我正在创建一个简单的WPF应用程序。我有一个函数OpenFile:我应该把这个函数放在View(代码隐藏)还是ViewModel中?

private void OpenFile(string fileName) 
{ 
    if(!File.Exists(Helper.GetPath(fileName))) 
    { 
     MessageBox.Show("Error opening file"); 
    } 
    else 
    { 
     //Code to handle file opening 
    } 
} 

理想情况下,这个函数应该在哪里?我觉得它应该在.xaml.cs,因为它访问了一个MessageBox,它来自View部分。但它也叫我的助手,这是在模型中。所以我也认为它可以在ViewModel。在ViewViewModel中有什么优势?有人能帮我一些指点吗?

谢谢。

回答

7

之一将其放置在视图模型将是可测试性的优点。您可以编写一个单元测试,检查消息框是否仅在文件存在的情况下才显示(更准确的说,如果您正在访问文件系统,则会进行集成测试)。

但是,因为您正在直接使用消息框,所以测试永远不会在构建服务器上完成,因为在显示消息框时,计算机将等待用户输入。

因此,我将努力对您的视图模型的抽象,这样就可以mock the message box在测试过程中。

7

该功能必须在视图模型。您需要在视图中创建一个用于显示错误消息的操作,并调用此方法而不是MessageBox.Show。显示消息框需要在View中完成。

通常,您应该避免在View内部实现任何业务逻辑,例如验证或处理文件。

2

如果您使用的是Microsoft Prism,则可以使用IInteractionRequest界面使视图创建MessageBox,但实际上将必要的响应传递回视图模型。

如果你是而不是使用Microsoft Prism,那么看看这个部分是如何工作的,并且模拟它或者使用一个类似的框架。


基本上,该代码应该去你的视图模型的可测试性,但更换线路,你显式调用MessageBox并且改用提到的IInteractionRequest

以下是与您要实施的场景相关的文档:Chapter 6: Advanced MVVM Scenarios。请看用户互动模式

相关问题