Prism NotificationRequest vs Xceed MessageBox

时间:2017-03-11 15:34:44

标签: wpf mvvm prism xceed prism-6

当我们使用MVVM时,我们被告知要避免在我们的ViewModel中使用System.Windows.MessageBox,我想这是因为它对我们的测试不利。这是真的吗?

使用Prism NotificationRequest,我们可以与用户通信,但它比简单的MessageBox稍微复杂一点。

另一种方法是使用Xceed Wpf Toolkit MessageBox,它比Prism NotificationRequest更简单。

我的问题是:它们都是等价的吗?我们可以用MVVM方式使用它们吗?如果否,我们何时需要使用NotificationRequest以及何时可以使用Xceed MessageBox?

谢谢

1 个答案:

答案 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...
    }
}

现在只需绑定要使用的服务(甚至可以在运行时决定),并在测试时注入模拟。