繁体   English   中英

WPF上的MVVM下的父子视图通信

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM