使View及其关联的ViewModel一起工作的最低要求是什么?
当视图由子视图(可以与其基数为1x1或1xN的父视图相关)组成时,ReactiveUI如何处理?就像一个带有2个子视图的视图,每个子视图都有ViewModel列表。
最佳答案
根据docs:
使用视图位置的最简单方法是通过ViewModelViewHost控件,该控件是一个视图(在Cocoa,UIView / NSView和基于XAML的平台上是一个控件),该控件具有单个ViewModel属性。设置ViewModel属性后,“视图位置”将查找关联的视图并将其加载到容器中。
那就是我通常所做的。您所有的Viewmodels / SubViewmodels等都只有一个实现IViewFor<whateverViewModel>
的视图。我使用WPF,这只是意味着我必须放入一个样板ViewModel
依赖项属性,这很不错。然后,您向ReactiveUI的IoC容器Splat注册:
要使用“查看位置”,您必须首先通过Splat的“服务位置”功能注册类型。
Locator.CurrentMutable.Register(() => new ToasterView(), typeof(IViewFor<ToasterViewModel>));
因此,基本上,只要您的View在其上托管一个/很多
ViewModelViewHost
控件,就可以在其上设置或绑定一个视图模型后,它将查找并加载已注册的视图。 ViewModelViewHost
是一个承载视图的容器控件。视图知道ViewModel,但是ViewModel不知道View。
就层次结构而言,
ViewModelViewHost
将基于绑定到它的任何ViewModel进行更新,并且它们将一直向下滚动。通常,我的顶级视图几乎都是一堆ViewModelViewHost
控件,它们只是从那里向下钻取。使用ReactiveUI的.WhenAny()
methods,您可以轻松观察ViewModels / SubViewModels等层次结构上的属性,而不必担心重新订阅或空检查。