【问题标题】:How to implement Dialog with/without feedback in an wpf 4.0 application using MVVM Light如何使用 MVVM Light 在 wpf 4.0 应用程序中实现带/不带反馈的对话框
【发布时间】:2013-04-03 08:45:39
【问题描述】:

有人可以指导我如何实现自定义对话框,以在不违反 MVVM 的情况下向 UI 显示错误或简单消息并接收响应。我非常需要这个。请帮帮我。

谢谢, 扎法尔

【问题讨论】:

  • 违反 MVVM 是什么意思?
  • 它具有最少的代码和可重用性。
  • 你能说得更具体点吗?你想交换数据(错误)从视图到松耦合的视图模型吗?然后 Messenger 类是要走的路
  • 我想要某种具有一些预定义功能的可定制消息框以 MVVM 方式显示消息,以便我可以从任何视图模型访问这些消息框。

标签: wpf mvvm mvvm-light


【解决方案1】:

参考您的评论,我强烈建议您仔细查看Messenger class。它甚至为此提供了 GalaSoft.MvvmLight.Messaging.DialogMessage 类型。但是您可以提供自定义的子类GenericMessage<T>

您注册这样的消息并定义消息到达时应该发生的情况:

Messenger.Default.Register<DialogMessage>(this,
    dm =>
    {
        MessageBox.Show(dm.Content, dm.Caption, dm.Button, dm.Icon);
    });

虽然只有 WeakReference 保留,但如果我不想再被通知或视图被丢弃,我倾向于取消注册。永远做个好公民;)

Messenger.Default.Unregister(this);

向接收者发送消息,并可选择定义回调以获取对话结果:

Messenger.Default.Send(new DialogMessage(this, "Content",
    result => Console.WriteLine(result.ToString()))
    {
        Caption = "Caption"
        Icon = MessageBoxImage.Asterisk,
        Button = MessageBoxButton.OK
    });

【讨论】:

  • 通过使用相同的方法,可以显示自定义对话框,但会增加一些复杂性。
【解决方案2】:

要处理 mvvm 模式中的任何类型的对话框内容,您应该使用一种 Dialog-Service。在this post 中,您会发现一些使用这种方法的提示。

将对话内容放入服务中可以保持 mvvm 模式不变。该服务负责对话的所有创建并提供结果。视图模型只是调用方法并订阅服务提供的事件。

以这种方式解决您的问题的一个好方法是使用User Interaction Patterns

就 MVVM 模式而言,视图模型负责启动与用户的交互以及消费和处理任何响应,而视图负责使用适当的用户体验实际管理与用户的交互。保持视图模型中实现的表示逻辑与视图实现的用户体验之间的关注点分离,有助于提高可测试性和灵活性。

在 MVVM 模式中实现这些类型的用户交互有两种常见的方法。一种方法是实现一个服务,视图模型可以使用该服务来启动与用户的交互,从而保持其对视图实现的独立性。另一种方法使用视图模型引发的事件来表达与用户交互的意图,以及绑定到这些事件并管理交互的视觉方面的视图中的组件。

这是一种用于执行 DialogServices 等的 MVVM 模式,因此它也符合您的要求。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    • 1970-01-01
    • 2012-07-22
    • 2012-08-03
    • 1970-01-01
    • 2013-03-03
    相关资源
    最近更新 更多