[英]Parent and Child View communication under MVVM on WPF
我已经为这个问题苦苦挣扎了一段时间了。 我正在构建我的第一个WPF MVVM应用程序。 在这个应用程序中,我有一个AppView(及其相应的viewmodel)。 子视图包含在选项卡中,并由单独的视图(UserControl)表示,并且每个视图都有一个视图模型。 到现在为止还挺好。
在一个视图中,有一个客户列表和一个“删除”按钮。 我在viewmodel上也有一个对应命令,实际上是删除了记录,这项工作很好。 现在,我希望删除按钮创建一个具有两个按钮的新视图,一个用于确认,另一个用于取消,然后如果用户单击“确认”按钮,则执行删除。
这里的问题是每个视图及其对应的视图模型都相互隔离(据我了解),因此我无法访问第二个视图视图模型以查看是否单击了确认按钮。
到目前为止,我发现的唯一可行的解决方案是在一个视图上添加一个事件,然后将另一个视图订阅到该事件。 但是,这项技术对于如此琐碎的任务而言相当复杂。 还有其他选择吗? 两个视图不能共享相同的数据上下文或视图模型吗?
谢谢!
var dialog = new DialogViewModel();// could be a DialogService if you wish
再次在此DialogViewModel或DialogService中选择实际操作的方式。
对话框。结果在这种情况下将返回您的确认为true或false
var settings = new Dictionary<string, object>(); settings["Owner"] = this; settings["WindowStartupLocation"] = WindowStartupLocation.CenterParent; windowManager.ShowDialog(dialog, null, settings);
if(dialog.Result == true) do the delete on the parent viewmodel.
或者,您可以使用IEventAggregator和消息包来完成所有操作。 我个人将第一个用于很多事情。 有时视情况而定。
大多数人会偏爱用于SoC的IDialogService事物方法,并对其进行DI运算,以使用它将其带入视图模型。 然后,每个视图模型将负责其自己的对话框。 从那里,您可以调用ShowDialog,因为它是WindowManager的一部分,您可以单击“是”或“否”,也可以为对话框视图设置任何设置。 有很多方法可以给猫皮剥皮,但是最后您需要KISS方法学,并且也不会破坏您尝试遵循的模式。.地狱的一切都可以将其添加到所有视图模型的viewmodelbase基类中继承以全局访问。 无论如何,所有功能都希望您的应用最终表现出来。
--update--
public class YourViewModel(IWindowManager winMan)
{
private readonly IWindowManager _winMan;
public YourViewModel()
{
_winMan = winMan;
}
public void DeleteCustomer()
{
var dialog= new DialogViewModel(); // not best way but...
var settings = new Dictionary<string, object>();
settings["Owner"] = this; //<< Parent
settings["StartupLocation"] = WindowStartupLocation.CenterParent;
_winMan.ShowDialog(dialog, null, settings);
if(dialog.Result)
//do delete
else
//do nothing
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.