使View与其关联的ViewModel协同工作的最低要求是什么?
当View由子视图组成时,ReactiveUI如何处理(子视图可以与其父级相关,基数为1x1或1xN)?就像具有2个子视图的视图和每个具有ViewModel列表的子视图一样。
答案 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等层次结构中上下查看属性,而无需担心重新订阅或空检查。