在ReactiveUI中加入Views和ViewModel的最小值

时间:2014-11-12 23:14:02

标签: mvvm reactiveui

使View与其关联的ViewModel协同工作的最低要求是什么?

当View由子视图组成时,ReactiveUI如何处理(子视图可以与其父级相关,基数为1x1或1xN)?就像具有2个子视图的视图和每个具有ViewModel列表的子视图一样。

1 个答案:

答案 0 :(得分:5)

根据docs

  

使用View Location的最简单方法是通过ViewModelViewHost控件,它是一个View(在Cocoa上,一个UIView / NSView,在基于XAML的平台上一个Control),它有一个ViewModel属性。设置ViewModel属性后,View Location将查找关联的View并将其加载到容器中。

这就是我通常做的事情。您的所有Viewmodel / SubView模型等都只有一个实现IViewFor<whateverViewModel>的相应视图。我使用WPF,这只是意味着我必须填充一个样板 - ViewModel依赖属性,这很好。然后注册ReactiveUI的IoC容器,Splat:

  

要使用View Location,您必须先通过Splat的服务位置功能注册类型。

 Locator.CurrentMutable.Register(() => new ToasterView(), typeof(IViewFor<ToasterViewModel>));

所以基本上只要你的View在其上托管一个/多个ViewModelViewHost控件,一旦你设置或绑定了一个viewmodel,它就会查找并加载已注册的视图。 ViewModelViewHost是承载视图的容器控件。

视图知道ViewModel,但ViewModel不知道视图。

就层次结构而言,ViewModelViewHost将根据ViewModel绑定到它的任何内容进行更新,并且它们将一直向下乌龟。通常我的顶级视图几乎都是一堆ViewModelViewHost控件,它们只是从那里向下钻取。使用ReactiveUI的.WhenAny() methods,您可以轻松地在ViewModels / SubViewModels等层次结构中上下查看属性,而无需担心重新订阅或空检查。