gpt4 book ai didi

c# - MVVM 光 : Ask information/confirmation in a command?

转载 作者:太空宇宙 更新时间:2023-11-03 10:35:01 26 4
gpt4 key购买 nike

我已经创建了我的第一个 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 模型广播一条消息,
  • 该消息将被注册到它的任何 View 或 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com