MVVM在视图模型之间传递值

时间:2011-06-17 23:38:46

标签: silverlight mvvm

我尝试处理从一个ViewModel传递值到另一个ViewModel的问题。这是一个例子。

我们有父视图及其相应的ViewModel,在该视图中我们选择项目,然后我们想要创建新的子视图(以编辑选择的细节),在XAML中实例化其ViewModel。 当我需要将值传递给Child ViewModel构造函数时,会出现问题(它是必须从数据库中获取的数据的Id)。我假设Parent的ViewModel必须与Child的ViewModel进行通信 - 但是由于Child的ViewModel没有实例化,因为Child的ViewModel在XAML中没有实例化,因此我们不能使用Messenger(MVVM Light Toolkit)并且只是从Parent的ModelView传播该信息,因为Child的ModelView无法订阅(注册到该类型的消息)。

我不想打破MVVM模式,也找不到任何好的解决方案。我很感激能得到的所有帮助。

2 个答案:

答案 0 :(得分:6)

MVVM模式的主要租户之一是您应该能够在没有View的情况下执行ViewModel代码,以便对View逻辑进行单元测试。换句话说,理想情况下,您应该能够以“无头”模式执行您的应用程序。

在您的示例中,您声明ParentView创建了一个ChildView,后者又创建了一个ChildViewModel(您正在努力连接)。这可以在无头模式下工作吗?在我看来,你依靠你的视图来执行这个父子导航。

如果以另一种方式翻转它,让ParentViewModel创建ChildViewModel,ViewModel之间的通信就不再存在问题。 ParentView需要为正在创建的新ChildViewModel“监视”(即属性更改),并相应地构造ChildView。

更详细:

  1. ParentView实例化ParentVM
  2. 用户以需要孩子的方式进行互动
  3. ParentVM创建一个ChildVM,通过ChildVM属性公开它
  4. ParentView处理生成的PropertyChanged事件,创建一个ChildView,将其DataContext设置为ChildVM。

答案 1 :(得分:0)

如果您使用任何框架怎么办?我的意思是MvvmLight,Caliburn Micro或Prism。每个框架都有一个消息传递基础您可以利用它们来使用发布/订阅方法来回传递状态。例如,看一下Prism。有几个快速入门显示事件模型。您还可以维护视图控制器以协调视图之间的通信。

看看Ward Bell的Prism Explorer示例应用程序。这是来自'09的article,但它今天仍然有用。特别是看他如何将实体对象从列表视图传递到子详细信息视图。