我尝试处理从一个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模式,也找不到任何好的解决方案。我很感激能得到的所有帮助。
答案 0 :(得分:6)
MVVM模式的主要租户之一是您应该能够在没有View的情况下执行ViewModel代码,以便对View逻辑进行单元测试。换句话说,理想情况下,您应该能够以“无头”模式执行您的应用程序。
在您的示例中,您声明ParentView创建了一个ChildView,后者又创建了一个ChildViewModel(您正在努力连接)。这可以在无头模式下工作吗?在我看来,你依靠你的视图来执行这个父子导航。
如果以另一种方式翻转它,让ParentViewModel创建ChildViewModel,ViewModel之间的通信就不再存在问题。 ParentView需要为正在创建的新ChildViewModel“监视”(即属性更改),并相应地构造ChildView。
更详细:
答案 1 :(得分:0)
如果您使用任何框架怎么办?我的意思是MvvmLight,Caliburn Micro或Prism。每个框架都有一个消息传递基础您可以利用它们来使用发布/订阅方法来回传递状态。例如,看一下Prism。有几个快速入门显示事件模型。您还可以维护视图控制器以协调视图之间的通信。
看看Ward Bell的Prism Explorer示例应用程序。这是来自'09的article,但它今天仍然有用。特别是看他如何将实体对象从列表视图传递到子详细信息视图。