我有一个需要在用户输入信息后从按钮中打开对话框的应用程序。
目前,我是这样做的(它可以正常工作):
- 按钮单击会在ViewModel中生成一个命令。
- ViewModel引发一个事件,该事件由Controller监听。
- Controller确定新窗口的详细信息(即View、ViewModel和Model),并打开它(ShowDialog)。
- 当窗口关闭时,Controller将结果添加到eventargs并返回给ViewModel。
- ViewModel将信息传递给Model。
这里有很多步骤,但它们都很合理,而且没有太多的输入。
代码看起来像这样(窗口要求用户输入姓名):
ViewModel:
AskUserNameCommand = DelegateCommand(AskUserNameExecute);
...
public event EventHandler<AskUserEventArgs> AskUserName;
void AskUserNameExecute(object arg) {
var e = new AskUserNameEventArgs();
AskUserName(this, e);
mModel.SetUserName(e.UserName);
}
控制器:
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;
}
我的问题是MVVM模式中水平通信如何工作。让控制器介入模型之间的数据传输似乎有些不对。我已经研究了中介者模式,以便让模型直接通信。但我不喜欢这个想法,因为它使模型依赖于GUI的实现细节。(即如果对话框用文本框替换,则需要更改模型)。