【问题标题】:MessageBox is not recommended in MVVM applications?在 MVVM 应用程序中不建议使用 MessageBox?
【发布时间】:2018-01-05 22:33:01
【问题描述】:

当我询问如何在 MVVM 中实现对话框时,有人建议我阅读这个帖子:

MVVM, DialogService and Dialog Result

在视图模型中,对话框是这样调用的:

var dialog = new DialogViewmodel();
var result = _dialogservice.ShowDialog("My Dialog", dialog);

if(result.HasValue && result.Value)
{
    //accept true
}
else
{
    //Cancel or false
}

但这与以这种方式使用消息框不同吗?

DialogResult result = MessageBox.Show("Hello");

if(result == DialgoResult-OK)
{
    //accept true
}
else
{
    //Cancel or false
}

在第二种情况下,我使用 MessageBox 而不是自定义对话框,所以我看不出有任何区别。

无论如何,在很多情况下,我都读过在 MVVM 应用程序中使用 MessageBox 是个坏主意,因为它破坏了 MVVM 模式。但如果这是真的,我看不出第一个解决方案如何不破坏 MVVM 模式,而第二个解决方案又破坏了它。

【问题讨论】:

  • 每个消息框都是 U/X 设计错误,因为它会打断用户。
  • 但是在 MVVM 和软件架构上下文中,尝试从依赖关系和可测试性的角度来看待它。直接调用 MessagBox 的 VM 更难测试。
  • 为什么不直接创建一个IAlertService 来处理MessageBoxs,就像处理对话框一样?

标签: c# mvvm dialog


【解决方案1】:

MVVM 模式的基本思想是关注点分离。 View Model 不应该知道如何处理或呈现对话框。为什么?以下是一些原因:

  • 测试您的视图模型:不需要任何对话框(假设您需要一直单击对话框)
  • 创建 GUI 应用程序的控制台应用程序(对话框应显示在控制台中,而不是弹出框)
  • 需要更改对话框的设计(假设您需要更改所有 MessageBox 调用)
  • ...

解决方案: 通过为对话框实现定义良好的接口来使用依赖注入。您可以在this answer 中找到一个非常好的基本示例。

结果: 调用_dialogservice.ShowDialog 可能只是MessageBox.Show 的包装,但也可能是控制台应用程序中控制台中的某个对话框或测试期间的调试日志。因此,代码与任何演示文稿都很好地分离。

【讨论】:

  • OP 根据他的对话服务只需要与IAlertService 等效的值。是否由 DI 提供,既不存在也不存在
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-08-08
  • 2016-01-24
  • 2012-11-15
  • 1970-01-01
  • 2012-02-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多