【发布时间】:2011-09-17 13:59:23
【问题描述】:
我尝试处理将值从一个 ViewModel 传递到另一个的问题。这是一个例子。
我们有父视图及其对应的 ViewModel,在该视图中我们选择项目,然后我们想要创建新的子视图(以编辑选择的详细信息),它在 XAML 中实例化其 ViewModel。 当我需要将值传递给 Child ViewModel 构造函数时会出现问题(它是必须从数据库中获取的数据的 Id)。我假设 Parent 的 ViewModel 必须与 Child 的 ViewModel 通信 - 但它无法完成,因为 Child 的 ViewModel 没有实例化,直到 Child 的 View 在 XAML 中执行此操作,所以我们不能使用 Messenger(MVVM Light Toolkit),而只是从 Parent 的 ModelView 传播该信息,因为 Child 的ModelView 无法订阅(注册该类型的消息)。
我不想破坏 MVVM 模式,也找不到任何好的解决方案。感谢您提供的所有帮助。
【问题讨论】:
-
您使用的是视图模型定位器吗?您提到在子视图存在之前不会实例化您的虚拟机。你在后面的代码中设置数据上下文?我们的父虚拟机有一组子虚拟机。我们使用与 MVVM Light 非常相似的信使。
-
哦,你不会“破坏” MVVM,它是指南而不是宗教。
-
不,我不知道视图模型定位器 - 将检查出来。 Child 的 viewModel 的 DataContext 在 XAML 中设置。在我们的解决方案中,Parent 不能为 Child 收集 VM,它只能传递必须从 Child 的 VM 中的数据库中获取的数据的 Id。
-
使用 ViewModel Locator,它就是你所需要的。在最简单的形式中,它是一个静态 MainViewModel,它在后面的 APP.XAML 代码中实例化。这样做将允许您使用 VS 中对象的属性正确绑定到您的元素。 MainViewModel 具有所有其他视图模型/模型集合。例如:Locator.Main.Parent.Child
-
Dan Andrews 感谢您的 cmets,我现在将检查该定位器。最好的问候
标签: silverlight mvvm