有人可以指导我如何实现自定义对话框,以便向UI显示错误或简单消息,并在不违反MVVM的情况下收回响应。我非常需要这个。请帮帮我。
谢谢, 扎法
答案 0 :(得分:3)
参考您的评论我强烈建议您仔细查看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
});
答案 1 :(得分:0)
要处理mvvm模式中的任何类型的对话框内容,您应该使用一种Dialog-Service。在this post中,您会发现这种方法的一些提示。
将对话框内容放入服务可保持mvvm模式不变。该服务负责所有对话框的创建,并可提供结果。视图模型只调用方法并订阅服务提供的事件。
以这种方式解决问题的好方法是使用User Interaction Patterns。
就MVVM模式而言,视图模型负责启动与用户的交互以及消费和处理任何响应,而视图负责使用适当的任何用户体验实际管理与用户的交互。保持视图模型中实现的表示逻辑与视图实现的用户体验之间的关注点分离,有助于提高可测试性和灵活性。
在MVVM模式中实现这些类型的用户交互有两种常用方法。一种方法是实现视图模型可以使用的服务来启动与用户的交互,从而保持其在视图的实现上的独立性。另一种方法使用视图模型引发的事件来表达与用户交互的意图,以及视图中绑定到这些事件并管理交互的可视方面的组件。
这是用于执行DialogServices等的MVVM模式,因此它也符合您的要求。