c# - MessageBox 不推荐在 MVVM 应用中使用?

标签 c# mvvm dialog

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

MVVM, DialogService and Dialog Result

在 View 模型中,对话框的调用方式如下:

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

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

但这与以这种方式使用 messageBox 不同吗?

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

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

在第二种情况下,我使用 MessageBox 而不是自定义对话框,因此我没有看到任何差异。

不管怎样,在很多情况下,我读到在 MVVM 应用程序中使用 MessageBox 是一个坏主意,因为它破坏了 MVVM 模式。但实际上,如果这是真的,我不明白第一个解决方案如何不会破坏 MVVM 模式,而第二个解决方案又会破坏它。

最佳答案

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

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

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

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

关于c# - MessageBox 不推荐在 MVVM 应用中使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45397485/

相关文章:

android - EditText 字段不接受输入

c# - Windows.UI.Notifications 丢失

python - 如何在 Python 中使用 Selenium 控制 WINDOW 下载 dialga-box 打开/保存/取消

c# - 将描边应用于 TextBlock (Windows 8)

c# - 主/细节的通用Viewmodel模式

wpf - 全局键绑定(bind)到事件 View 的 View 模型中的命令

wpf - 使用 MVVM 将 TextBox 绑定(bind)到 WPF 中的大字符串

python - 如何使用tix.DirSelectDialog?

javascript - 如何以动态形式使用模型

c# - 访问属性