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

aif*_*rfa 2 c# silverlight prism mvvm

我有一个可以创建另一个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));
}
Run Code Online (Sandbox Code Playgroud)

问题是 ...

  • 我的ViewModel需要引用区域的名称和View的名称.
  • "DetailRegion"必须包含"OrderView"对象.
  • DetailView.DataContext设置为OrderViewModel(使用聚合事件订阅)

这是紧耦合吗?

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

我只想简化解耦View-ViewModel.

Gon*_*ing 9

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

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

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

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

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

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

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

  • "每个ViewModel都需要有一个方法来获取它的数据"是错误的.ViewModels应该不知道数据来自哪里,只知道它的形状.他们是,而且应该只是愚蠢的容器.控制器从Models获取数据并将其填充到ViewModels中.从描述系统的方式来看,您不是在进行测试驱动的开发.由于缺少单独的控制器,TDD的难度增加了10倍.随意忽略我的建议,但我已经做到了两个方面,并知道什么更好.你为什么不亲自尝试,然后回来.一旦你尝试它真的更有意义:) (4认同)
  • 当您设计*app*时,每个不同的视图(共享)有一个类,每个不同的ViewModel(共享)有一个类,每个控制器有一个类.对于多个视图和视图模型,可能只有一个控制器处理逻辑,但这不是重点.在基类中隐藏"逻辑"它不是继承的目的.它用于实现"Is-a"关系.争论不这样做的好处,因为看起来更多打字/工作是没有意义的.在实践中,复杂的应用程序更容易使用控制器编写/管理.我从经验中说明这一点,随意不同意:) (2认同)