prism.forms有Xamarin.Forms依赖

时间:2016-12-12 15:25:18

标签: mvvm xamarin.forms prism mvvmcross

在MVVM模式中,ViewModel不应该对View(及其依赖项)有任何了解。

Xamarin.Forms的Prism(MVVM库)依赖于Xamarin.Forms,因此它突破了上述规则,尽管棱镜团队声称要实现Microsoft模式&实践。另一个库没有这种依赖(例如mvvmcross,freshmvvm)

如何理解?

修改

  1. 根据BraveHeart的回答:将Prism中创建的ViewModel项目Xamarin.Forms(具有Xamarin.Forms依赖性)迁移到WPF的ViewModel项目有多难?
  2. Prism for Xamarin.Forms将来会删除Xamarin.Forms依赖吗?

2 个答案:

答案 0 :(得分:1)

有趣的一点,但不是很准确。

MVVM就像你说的那样是将ViewModel与View分开。 那么破坏模式的是,如果我们在ViewModel中有一个View实例,你就可以直接从viewmodel控制它,这将破坏MVVM模式。

在viewmodel中拥有视图所依赖的库不会破坏mvvm模式。考虑在两侧都有一个Json库的情况。但是,它会限制我们的解决方案的跨平台。因此,在您的情况下,您将无法与Xamarin(例如WPF)之外的其他平台共享您的视图模型。

如果你真的想要使用Prism并且同时拥有相同的ViewModel用于WPF,那么在理论中这将起作用:

  1. 将ViewModel移动到一个单独的可移植项目,该项目既不具有Xamarin.Forms也不引用Prism。
  2. 将Prism.Forms逻辑移到后面的代码中,可以注入NavigationService和PageDialogServices之类的东西。同时,我认为,您必须自己将视图绑定到视图模型,并实例化ViewModel并将它们指定为绑定上下文。所以也许你会破坏viewmodel定位器。
  3. 如果您想从ViewModel向用户发送消息,那么只需在视图模型中引发视图侦听它的事件,您就可以从视图中显示消息。
  4. 通过这种方式,您可以与WPF共享视图模型。
  5. 备注

    • 由于WPF和Mobile非常不同,因此您可能难以共享Vewmodel,而不是技术上的困难,而是合乎逻辑的。例如,Mobiles是PageBased,每个页面都有自己的理想和更清晰的ViewModel。另一方面,WPF是一个具有一个大ViewModel的大视图。我认为从Xamarin共享所有视图模型并在WPF项目中有效使用它们的唯一方法是将WPF项目分配到区域。
    • 如果AutoViewModelLocator能够正常工作,我对它不是十分肯定,只要使用注册就可以依赖Prism团队。我记得有一个Prism的实现,你可以注册View和它的ViewModel,但我不记得哪个版本。但我个人认为在代码隐藏或Xaml中只说BindingContext = _viewmodel;并不是什么大问题。

答案 1 :(得分:0)

广告1:鉴于视图有些类似,迁移视图模型应该很容易,也许是复制粘贴加上整理的问题

广告2:如果发生这种情况我会感到非常惊讶,反过来更有可能,请参阅this comment on github