2

我有一个可以创建另一个 ViewModel 的 ViewModel。

我想将此 ViewModel 设置为现有 View 的数据上下文,然后导航到该 View。

在 MyViewModel

private void CreateNewOrder()
{
    var order = new OrderViewModel(new Order(){/* setup some things */});
    // another ViewModel subscribes to MyCustomEvent
    this.eventAggregator.GetEvent<MyCustomEvent>().publish(order); 
    this.regionManager.RequestNavigate("DetailRegion", new Uri("OrderView", UriKind.Relative));
}

问题是 ...

  • 我的 ViewModel 需要参考区域名称和视图名称。
  • “DetailRegion”必须包含“OrderView”对象。
  • DetailView.DataContext 设置为 OrderViewModel(使用聚合事件订阅)

这是紧耦合吗?

我花了一些时间查看 Prism Quickstart 项目,发现“控制器”或太复杂的东西。

我只是想简化解耦 View-ViewModel。

4

1 回答 1

9

您添加到 ViewModel 的代码属于控制器。

  • ViewModel 是保存特定形状数据的哑容器。他们不知道数据来自哪里或显示在哪里。
  • 视图通过绑定到视图模型来显示特定形状的数据。他们不知道数据来自哪里,只知道如何显示。
  • 模型保存真实数据。他们不知道在哪里消费。

那么这张照片缺少什么?- 控制器发布和侦听事件并从模型中获取 ViewModel 的数据。他们还控制导航。

它确实应该被设计为 MVCVM。由于缺少控制器类,我认为 MVVM 的滥用没有尽头。再试一次 Prism 快速入门。

只是为了阐明控制器如何适应 MVVM 图片,下面是一个示例场景:

  • 控制器由模块或应用程序*注册和初始化。
  • 控制器订阅“显示详细信息”消息。
  • 控制器收到“显示详细信息”消息。
  • 控制器构造一个“详细信息”VM,用数据填充它并将任何 ICommand 属性分配给控制器中的代码(例如,几乎所有应用程序逻辑都在控制器中)。
  • 控制器触发适当视图的显示,为 VM 提供服务。
  • 视图数据绑定到虚拟机。按钮绑定到 VM 中的 ICommand。
  • 用户编辑数据并点击提交。提交代码位于控制器中,并决定如何处理 VM 中的新数据。

*注意:虚拟机和视图不需要等待消息,因此只有控制器实际上需要在应用程序的生命周期内存在(即非常小的占用空间)。这对于移动应用程序来说非常棒,对于任何应用程序来说通常都是一件好事。

于 2012-04-23T15:23:59.343 回答