如何处理这绝对取决于情况 - 没有单一的最佳规则(恕我直言)
对于一般错误显示模式,http ://slodge.blogspot.co.uk/2012/05/one-pattern-for-error-handling-in.html 有一个建议
我使用类似的模式来显示应用程序级别的通知 - 例如,当长时间运行的操作完成或聊天消息到达时或...
关于如何显示消息框的一篇有趣的文章是:http ://awkwardcoder.blogspot.co.uk/2012/03/showing-message-box-from-viewmodel-in.html - 我不确定我会完全遵循最终解决方案,但是对于不该做什么肯定有一些好处。
对于您更新的场景,我会考虑使用信使(如 TinyMessenger)或使用由 ViewModel 公开并由其 View 使用的普通 C# 事件
在页面上单击一个按钮,这会导致一个方法在 ViewModel 中运行
我将使用绑定到按钮 Click/Tap/TouchDown 的 ICommand 来实现这一点
它进行评估以确定应该向客户显示两条消息中的哪一条。
我肯定会在服务中实现逻辑
这将从 ViewModel 调用 - 结果/决定可能会导致某些属性或私有字段状态更改。
然后视图如何决定显示一条消息?我可以想到3个选项:
- 视图可以只响应属性更改(正常的 Mvvm INPC)——这将是我的偏好
- ViewModel 可以公开它触发的正常 C# 事件...
- ViewModel 可以发送消息
最后一个选项(Messenging)可能是这里最灵活的解决方案——它将 View 和 ViewModel 解耦,以防您以后决定更改职责。要实现消息传递,可以:
该消息将显示为警报或弹出窗口(本机,或者最好完全由我设计)。
这是一个 View 问题 - 因此将完全由 View 项目控制。我会使用如下控件:UIAlert、Toast、ToastPrompt 等 - 所有这些都可以设置样式
消息会在(单击 OK 按钮,或者最好是 3 秒)后消失。消息被删除后...
我会在视图中使用某种形式的代码隐藏(或者可能是 WP7 中的行为)。这将检测到点击/淡入淡出/消失,然后调用 ViewModel 上的 ICommand(我的偏好)或公共方法
也将导航一个新页面
将从 ViewModel 请求此导航
(取决于显示的两条消息中的哪一条)。
这将很容易通过上述流程进行跟踪......大概 ViewModel 已经知道要显示什么。
所以这就是我要做的...
- 它将应用程序流逻辑保留在 ViewModel(及更低版本)中
- 它将演示文稿保留在视图中
...但我敢肯定还有其他选择:)
最后一点......淡出然后导航逻辑真的会被 WP7 和 Android 上的切换/墓碑“搞砸”——这对于您的特定场景可能很重要,也可能无关紧要。