【问题标题】:prism.forms has Xamarin.Forms dependencyprism.forms 具有 Xamarin.Forms 依赖项
【发布时间】:2016-12-12 15:25:17
【问题描述】:

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

用于 Xamarin.Forms 的 Prism(MVVM 库)依赖于 Xamarin.Forms,因此它违反了规则,尽管 prism 团队声称满足 Microsoft 模式和实践。其他库没有这样的依赖(例如 mvvmcross、freshmvvm)

如何理解?

编辑:

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

【问题讨论】:

    标签: mvvm xamarin.forms prism mvvmcross


    【解决方案1】:

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

    你说的MVVM是将ViewModel与View分开。 因此,如果我们在 ViewModel 中有一个 View 实例,并且您直接从会破坏 MVVM 模式的 viewmodel 开始控制它,那么会破坏这种模式的方法。

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

    如果您真的想使用 Prism 并同时为 WPF 使用相同的 ViewModel,那么理论上这会起作用:

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

    备注

    • 由于 WPF 和 Mobile 非常不同,那么共享 Vewmodel 可能会有困难,不是技术困难,而是逻辑困难。例如,Mobiles 是 PageBased 的,并且每个页面在理想和更简洁的情况下都有自己的 ViewModel。另一方面,WPF 是一个大视图和一个大 ViewModel。我认为从 Xamarin 共享所有视图模型并在 WPF 项目中有效使用它们的唯一方法是将 WPF 项目划分为区域。
    • 我不能 100% 确定 AutoViewModelLocator 是否可以正常工作,它可能会根据 Prism 团队仅使用注册来工作。我记得有一个 Prism 实现,您可以在其中注册 View,它是 ViewModel,但我不记得是哪个版本。但我个人认为在代码隐藏或 Xaml 中说 BindingContext = _viewmodel; 并没有什么大不了的。

    【讨论】:

    • 感谢您的回答。切换平台是我害怕的 - 实际上这就是我问的原因。 MVVM 允许轻松切换视图,并且使用 Prism for Xamarin.Forms 将限制这种可能性。我要编辑问题。
    • 没问题我会编辑我的答案,但我需要知道你用棱镜做什么?我的意思是你为什么在 ViewModel 中有它?是自动视图模型定位器吗?
    • 我还没有使用 Prism。我只是选择在某些项目中使用 mvvm 框架。我肯定会使用导航,也许是消息中心,prism.forms 的 autofac ioc 插件,自动绑定视图和视图模型(我猜是 autoviewmodel 定位器)
    • 如果设计得当,您可以使用 Prism 轻松跨平台共享 VM。查看这个简单的示例github.com/brianlagunas/TodoApp
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-02-07
      • 2017-09-26
      • 1970-01-01
      • 2014-08-27
      • 1970-01-01
      • 2012-11-27
      • 2021-02-15
      • 2019-03-16
      • 1970-01-01
      相关资源
      最近更新 更多