如何实现复合ViewModel的复合视图?

时间:2013-06-28 13:30:19

标签: mvvmcross

我刚刚进入我的第一个项目(令人难以置信的优秀)MVVMCross,我无法弄清楚如何做一些看似相当基本的事情:复合视图。

假设我有一个Person(FirstName,LastName等),一个人有一个Address(街道,城市,邮政编码等)。所以我还会有PersonViewModelAddressViewModel

这是一个严格基于平板电脑的应用程序(实际上仅限iPad),我想使用遏制使PersonView包含(可重用)AddressView,以便外部(人)视图绑定到Person,而内部(地址)视图绑定到Person.Address

我(模糊地)理解用于显示视图的演示者概念,正如所讨论的here,但我看不到如何处理从Person到Address和back的变化传播。

假设Person对象有一个Address对象,但PersonViewModel通过传递某种Address ID并重新水化来显示AddressView中的AddressViewModel。然后,AddressView绑定到不同的地址对象,而不是Person包含的地址对象。我不知道如何保持两者同步,这当然会破坏绑定的整个目的。

我该怎样做我想做的事?

3 个答案:

答案 0 :(得分:11)

这是一个非常广泛的话题......

......并且有很多可能的答案。

我认为将ViewModel视为一个非常简单的概念非常重要 - 我想鼓励您将ViewModel视为视图模型 - 绝对不要将它们视为整页'对象。

...

在MvvmCross中,如果您愿意,可以使用ShowViewModel和自定义演示者来更改UI - 这在几个MvvmCross示例(包括拆分视图演示者)中进行了演示 - http://slodge.blogspot.com/2013/05/n24-splitviewpresenter-n1-days-of.html

ShowViewModel技术对于navigation非常有用 - 用于更改整个页面或其中的重要部分。

但是,如果您的应用不需要导航范例,则不必使用导航范例。

如果你愿意,那么你可以改为:

  • 在核心
  • 中构建自己的视图模型层次结构
  • 然后您可以在UI中构建自己的数据绑定视图层次结构

完全取决于你 - 你的应用为王

...

我觉得我不能很好地解释这个......

...

所以我放弃并录制了这段视频 - 也许有帮助:http://slodge.blogspot.co.uk/2013/06/n32-truth-about-viewmodels-starring.html

视频和示例代码仅涵盖iPad,但我希望您能够轻松(如何)将其扩展到其他平台:

  • 对于Windows,您可以使用UserControl
  • 对于Android,您可以使用MvxFrameControl,自定义视图或Fragment代码。

答案 1 :(得分:0)

除了默认的视图导航外,还有一个允许控制导航的插件,希望它有所帮助:https://github.com/ChristianRuiz/MvvmCross-ControlsNavigation

答案 2 :(得分:0)

请查看MvvmCross项目的自定义演示者的此实现。支持android中的Fragments以及多个片段到另一个片段/活动:

https://github.com/JelleDamen/CustomMvxAndroidPresenter