当我们使用MVVM时,我们被告知要避免在我们的ViewModel中使用System.Windows.MessageBox,我想这是因为它对我们的测试不利。这是真的吗?
使用Prism NotificationRequest,我们可以与用户通信,但它比简单的MessageBox稍微复杂一点。
另一种方法是使用Xceed Wpf Toolkit MessageBox,它比Prism NotificationRequest更简单。
我的问题是:它们都是等价的吗?我们可以用MVVM方式使用它们吗?如果否,我们何时需要使用NotificationRequest以及何时可以使用Xceed MessageBox?
谢谢
答案 0 :(得分:0)
如果您在测试时从可以替换为模拟的服务中调用MessageBox.Show()
,那么您就可以了。
毕竟,你不想要的是在运行你的视图模型单元测试时弹出一个消息框......
示例:
public interface IMessageBoxService
{
ClickedButten ShowMessageBox( string message, Buttons buttons );
}
internal class SomeViewModel
{
public SomeViewModel( IMessageBoxService messageBoxService )
{
_messageBoxService = messageBoxService;
}
public void SomeMethodThatNeedsAMessageBox()
{
var theClickedButton = _messageBoxService.ShowMessageBox( "Click me!", Buttons.Ok | Buttons.Cancel );
// react to the click...
}
}
internal class SystemMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
MessageBox.Show(...);
// adapt result...
}
}
internal class XceedMessageBoxService : IMessageBoxService
{
public ClickedButten ShowMessageBox( string message, Buttons buttons )
{
// adapt parameters...
Xceed.ShowMessageBox(...);
// adapt result...
}
}
现在只需绑定要使用的服务(甚至可以在运行时决定),并在测试时注入模拟。