MVVM在视图模型之间传递值

kkr*_*983 6 silverlight mvvm

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

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

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

Col*_*inE 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.

  • @kkris1983 - 这是MVVM的"黄金法则",VM对View一无所知.这样做意味着您无法在没有View的情况下运行VM.这就是我要做的事情(1)ParentView实例化ParentVM,(2)用户以需要子进程的方式进行交互,(3)ParentVM创建一个ChildVM,通过ChildVM属性公开它,(4)ParentView处理结果PropertyChanged event,创建一个ChildView,将其DataContext设置为ChildVM.那应该可以解决你的问题!它完全是"有效"的MVVM使用. (3认同)
  • 我更喜欢保持简单.问题来自于与MVVM斗争的人,我不认为在IOC或DI中添加会有很大帮助.我已经创建了许多MVVM应用程序,其中顶级视图创建了顶级视图模型,但仍然能够对视图模型进行单元测试并具有设计时数据.让一些第三实体耦合视图和视图模型当然是好的.但它没有必要,它不是MVVM本身的一部分. (2认同)