- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我已经创建了我的第一个 MVVMLight 项目,我有一个问题:
我有一个按钮,上面绑定(bind)了一个命令。当命令执行时,在不同的用例中,我必须向最终用户获取/提供信息,例如:
我知道我可以做一个MessageBox.Show
/...但是在哪里呢?因为关于关注点分离,我猜它应该在 ViewModel 中?那么我应该使用什么机制呢?
我的 ViewModel 基本上是这样的:
public class MainViewModel : BaseViewModel
{
private static readonly Logger m_logger = LoggerProvider.GetLogger("MyPath.MainViewModel");
private ISerializationService m_serializationService;
public ICommand TrySaveCommand { get; set; }
//Lot of other fields here
public MainViewModel()
{
m_serializationService = ServiceLocator.Current.GetInstance<ISerializationService>();
TrySaveCommand = new RelayCommand(TrySave);
}
private void TrySave()
{
DispatcherHelper.RunAsync(() =>
{
//Here I need to get the path where I save on some condition
m_serializationService.SaveProject(pathIGotFromTheUser);
//Give a feedback that everything has been correctly saved(for test purpose, a MessageBox.Show() )
});
}
}
那么我应该怎样做才能从用户那里获取到文件上的信息来保存呢? (使用 SaveFileDialog
)并显示它已正确保存(使用 MessageBox.Show
)
谢谢
最佳答案
Laurent Bugnion 在他的 mvvmlight 库中引入了一个非常方便的助手类,称为 Messenger
,使用它您可以在 View 模型、 View 或 View 模型/ View 之间发送和接收通知和/或信息。这是它是如何工作的
Messenger.Default.Send<..>(..)
View 模型广播一条消息,Messenger.Default.Register<>(..)
)并根据该通知执行适当的逻辑(例如显示消息或对话框..)要在您的案例中应用此方法,您必须在代码后面添加一些与 View 相关的逻辑,以显示对话框和确认消息。 主窗口.xaml.cs
public partial class MainWindow : Window
{
public MainWindow()
{
Messenger.Default.Register<NotificationMessage>(this, (m) =>
{
switch (m.Notification)
{
case "SaveFile":
var dlg = new SaveFileDialog();
if (dlg.ShowDialog() == true)
{
var filename = dlg.FileName;
Messenger.Default.Send<String>( filename,"FileSaved");
}
break;
case "WentWell":
MessageBox.Show("Everything went well Wohoo");
break;
}
});
}
}
此处 View 将根据广播的 ViewModel 通知显示对话框或确认消息框
在 MainWindowViewModel 中
public class MainViewModel : ViewModelBase
{
private static readonly Logger m_logger = LoggerProvider.GetLogger("MyPath.MainViewModel");
private ISerializationService m_serializationService;
private RelayCommand _trySaveCommand;
public RelayCommand TrySaveCommand
{
get
{
return _trySaveCommand
?? (_trySaveCommand = new RelayCommand(
() =>
{
Messenger.Default.Send(new NotificationMessage("SaveFile"));
}));
}
}
public MainViewModel()
{
m_serializationService = ServiceLocator.Current.GetInstance<ISerializationService>();
Messenger.Default.Register<string>(this, "FileSaved", (pathIGotFromTheUser) =>
{
m_serializationService.SaveProject(pathIGotFromTheUser);
//Give a feedback that everything has been correctly saved(for test purpose, a MessageBox.Show() )
Messenger.Default.Send<NotificationMessage>(new NotificationMessage("WentWell"));
});
}
与按钮相关联的 TrySaveCommand 或任何将触发 View 的内容。
** 在你说之前,我不认为你这样做违反了任何 mvvm 规则,显示消息框或对话是与演示相关的逻辑,应该在你的解决方案的 View 部分处理;通过发送消息的 View 模型实际上并不知道任何关于 View 的想法,他只是做一些工作并广播状态消息,最后是关于 Messenger 类的一些深入信息 HERE .
关于c# - MVVM 光 : Ask information/confirmation in a command?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28105391/
Win32 的 Delphi XE5 编译器具有新的调试信息设置:有限调试信息。 有限调试信息和调试信息有什么区别? 最佳答案 某些编译器提供调试标志的变体,可提供不同级别的调试信息和优化。根据编译和
我有一个 highcharts 散点图,我想添加一些自定义功能。对于每次单击 highcharts 中的项目(单击过滤器、数据点和关闭按钮),我想将有关单击的项目的信息发送到我在下面包含的函数“s”。
我们在 Java 应用程序中更新了安全证书,突然我们开始收到下面提到的异常: java.lang.SecurityException: class "org.hibernate.cfg.Configu
我正在使用 HttpURLConnection 实例来连接到 URL。 然后我调用 getResponseCode 方法以确定连接状态。 我正在使用此方法轮询连接,直到返回的响应代码不是 1xx: H
我很难调试 ASP.NET MVC 代码。我最终按照本 website 中的描述进行操作.调试符号已加载并适用于所有 dll,但 System.Web.MVC。当我双击 stacktrace 窗口中的
好吧,我在很多应用程序上都发现了这个文本,那就是当我安装一些应用程序时需要android.permission.READ_LOGS 权限,它们显示一些文本,例如“读取敏感日志数据的权限...”我不明白
我有一个在浏览器中运行并从 Javascript 调用的小程序。有 2 个类:PortalLauncher 和 ParamSplitter,它们位于默认包中。 Javascript 调用 Portal
我在 eclipse 中使用 OSGi 项目运行 JUnit 测试,我遇到了这个异常: java.lang.SecurityException: class "org.eclipse.core.run
我正在开发一个给 PDF 加水印的小工具,它适用于某些 PDF,但对某些其他 PDF 会崩溃。 我正在使用 iText 库和 bouncycaSTLe(依赖项) pom.xml:
很抱歉,我不知道这是否是属于mathoverflow的数学问题,还是属于这里的计算机科学问题。 就是说,我相信我理解基本的difference between data, information, a
在什么情况下“反文档频率”在信息检索中不起作用? 最佳答案 如果您不希望在系统中权衡稀有术语而不是频繁出现的术语,则可能不希望使用IDF。此外,计算idf是一项昂贵的操作。从以下事实可以明显看出这一点
我正在尝试计算 Average Precision (和 Mean Average Precision )在 Oxford Building image dataset 上. 下面是他们提供的用于计算
信息隐藏如何帮助解耦构成系统的模块? 最佳答案 封装(信息隐藏)允许您只向外界公开绝对最小值。这意味着您可以在不影响客户的情况下将未公开的位更改为您心中的内容。 一个例子。假设您已经实现了一个将字符串
想象一下,在接下来的 10 年里,你拥有世界上所有的 super 计算机。你的任务是尽可能无损地压缩 10 部完整的电影。另一个标准是普通计算机应该能够即时解压缩,并且不需要花费太多的 HD 来安装解
我生活在一个每年更改两次时间的国家。即:一年中有一段时期与 UTC 的偏移量为 -3 小时(-180 分钟),其他时期的偏移量为 -4 小时(-240 分钟) 从图形上看: |-----
在哪里可以找到有关 DrRacket 中 #:when 构造的文档? 这是完整的示例: (define (problem_9 sum) (for*/first ([c (in-range 3 (-
有人知道在网站上查找最相关的联系信息的脚本/食谱/库吗? 一些可能的情况: 在个人网页上查找联系电话号码 在博客上查找所有者电子邮件地址 查找联系页面的网址 最佳答案 查看WSO2's Mashup
你们如何管理信息溢出?你们都用什么工具?有用的工具之一是 RSS 提要阅读器。是否有任何机构使用任何其他工具或任何其他方式来有效管理信息? 最佳答案 做一个信息势利小人。 如果该博客没有绝对震撼您的世
我最近根据 Artima Inside the JVM 2-nd Ed 阅读了有关 JVM 规范的内容。其中一章提到了 Java 运行时中的类型存储,内容如下: An instance of clas
我已阅读 Permuterm indexes stanford 网站上的页面,但是我仍然无法弄清楚我们如何从以下地址到达:*X*至 X* . 那么$在哪里? ? 我可以得到这些: For X, loo
我是一名优秀的程序员,十分优秀!