在WPF的MVVM模式中,处理对话框是更复杂的操作之一.由于您的视图模型对视图一无所知,因此对话通信很有趣.我可以公开一个ICommand,当视图调用它时,会出现一个对话框.
有没有人知道处理对话结果的好方法?我说的是关于Windows对话框,比如MessageBox.
我们这样做的方法之一是在viewmodel上有一个事件,当需要对话框时,视图会订阅该事件.
public event EventHandler<MyDeleteArgs> RequiresDeleteDialog;
Run Code Online (Sandbox Code Playgroud)
这没关系,但这意味着视图需要代码,这是我想远离的东西.
我有一个应用程序,需要从用户输入一些信息的按钮打开一个对话框.
目前我这样做(工作正常)
有很多步骤,但它们都有意义,并没有太多的打字.
代码看起来像这样(窗口要求输入用户名)
视图模型:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
Run Code Online (Sandbox Code Playgroud)
控制器:
mViewModel.AskUserName += (sender,e) => {
var view = container.Resolve<IAskUserNameView>();
var model = container.Resolve<IAskUserNameModel>();
var viewmodel = container.Resolve<IAskUserNameViewModel>(view, model);
if (dlg.ShowDialog() ?? false)
e.UserName = model.UserName;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是水平通信如何在MVVM模式中工作.不知何故,让控制器参与模型之间的数据传输似乎是错误的.
我已经查看了中介模式,让模型直接进行通信.不喜欢这个想法,因为它使模型取决于GUI的实现细节.(即如果用文本框替换对话框,模型需要更改)