使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等层次结构上的属性,而不必担心重新订阅或空检查。

07-24 16:09