【问题标题】:WPF MessageBox with MVVM pattern?带有MVVM模式的WPF MessageBox?
【发布时间】:2012-12-27 03:58:19
【问题描述】:

假设我想向用户显示一些验证错误。在 MVVM 模式中,我可以有一个绑定到我的视图模型上的某个属性的标签。但是,如果我想在严格遵守 MVVM 模式的同时显示一个消息框怎么办。我的视图模型将绑定到什么,以及它如何触发创建/显示的消息框?

【问题讨论】:

标签: c# .net wpf mvvm messagebox


【解决方案1】:

有一个接口IMessageBoxService为:

interface IMessageBoxService
{
    bool ShowMessage(string text, string caption, MessageType messageType);
}

创建一个WPFMessageBoxService 类:

using System.Windows;

class WPFMessageBoxService : IMessageBoxService
{
    bool ShowMessage(string text, string caption, MessageType messageType)
    {
        // TODO: Choose MessageBoxButton and MessageBoxImage based on MessageType received
        MessageBox.Show(text, caption, MessageBoxButton.OK, MessageBoxImage.Information);
    }
}

在您的 ViewModel 中接受 IMessageBoxService 作为构造函数参数并使用 DI/IoC 注入 WPFMessageBoxService

在 ViewModel 中,使用 IMessageBoxService.ShowMessage 显示 MessageBox。

ShowMessageCommand = new DelegateCommand (
    () => messageBoxService.ShowMessage(message, header, MessageType.Information)
);

根据您的需要自定义IMessageBoxService 界面,并选择更好的名称。

【讨论】:

  • 有趣而简单的解决方案!如何将 MessageBox 居中在 Window / Control 的中间?在 WPF 中通过回调接口通知 View 并不常见。通常,视图会收到有关绑定的通知。但该解决方案的巨大优势在于简单明了!
  • @Tilak @Nautious 和 @Cameron MacFarland .,请你帮我解决这个错误,上面写着 Delegate 'System.Predicate<object>' does not take 0 arguments () => messageBoxService.ShowMessage(message, header, MessageType.Information);
  • 改成(s) => messageBoxService.ShowMessage(message, header, MessageType.Information)
  • @Tilak 当您将 IMessageBoxService 作为参数传递给视图模型构造函数时,您的意思是,例如创建 WPFMessageBoxService 的实例并将此实例传递给视图模型构造函数?
  • @Tilak MessageType 是什么?是来自 System.Messaging 程序集吗?
【解决方案2】:

您可以将消息框控件的可见性绑定到验证。

为此,您需要一个 Bool To Visibility 转换器。

请参阅此处了解如何使用内置转换器: Binding a Button's visibility to a bool value in ViewModel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-19
    • 2016-07-12
    • 2016-02-12
    • 2011-09-23
    • 1970-01-01
    • 2016-01-24
    相关资源
    最近更新 更多