Prism MVVM,我应该将IRegionManager放在ViewModel中还是其他地方?

时间:2012-04-21 06:24:17

标签: c# silverlight mvvm prism

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

我想将此ViewModel设置为现有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需要引用区域的名称和View的名称。
  • “DetailRegion”必须包含“OrderView”对象。
  • DetailView.DataContext设置为OrderViewModel(使用聚合事件订阅)

这是紧耦合吗?

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

我只想简化解耦View-ViewModel。

1 个答案:

答案 0 :(得分:9)

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

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

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

它应该被设计为MVCVM。通过缺少控制器类,我看不到MVVM的误用。再给Prism Quickstart吧。

  

为了澄清控制器如何适应MVVM图片,这是一个例子   情形:

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

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