反应式UI - 何时激活和输出属性



我正在使用ReactiveUI,我正在尝试使用WhenActive更改所有ViewModels的规则,但我无法理解如何使其与输出属性结合使用。

模式类似于

this.WhenActivated(
registerDisposable =>
{
registerDisposable(this.Bind(…));
registerDisposable(this.WhenAny(…));
registerDisposable(this.WhenAnyValue(…));
});

输出属性如下所示

protected readonly ObservableAsPropertyHelper<object> _Obj;
public object Obj => _Obj.Value
_Obj = this.WhenAnyValue(x => x.Something).ToProperty(this, x => x.Obj, out _Obj);

因此,我认为将这些统一起来的唯一方法是:

class MyClass {
protected readonly ObservableAsPropertyHelper<object> _Obj;
public object Obj => _Obj.Value
public MyClass()
{
_Obj = this.WhenAnyValue(x => x.Something).ToProperty(this, x => x.Obj, out _Obj);
this.WhenActivated( registerDisposable =>
{
registerDisposable(_Obj);
});
}

}

这会按预期工作还是有另一种更好的方法可以做到这一点?

在这种情况下,不需要释放_Obj,因为Something与 _Obj 具有相同的范围(它们都包含在 MyClass 中(。但是,如果要基于服务中包含的可观察量(通常比视图模型具有更长的生存期(_Obj,则需要释放它。

// _Obj should be disposed of, in this case.
_Obj = someService
.SomePipeline
.ToProperty(this, x => x.Obj)

旁注:如果要赋值,则无需使用 out 参数。以下内容等效于上述内容:

someService
.SomePipeline
.ToProperty(this, x => x.Obj, out _Obj)

因此,对于某些服务,您可以将_Obj放入WhenActive中,但是它

创建粘性争用条件,其中 OAPH 在 OAPH 为 null 时可能为空 访问相应的属性 (Obj( 太早。

这些信息以及上面的引用直接取自Kent Boogaart的书"你,我和ReactiveUI"。

他很友好地为上述方案提供了一个解决方案,将激活转换为管道。您可以使用这些扩展(第一个用于视图模型,第二个用于视图(,如下所示:

_Obj = this
.GetIsActivated()
.Select(isActivated => isActivated ? someService.SomePipeline : Observable.Return(null))
.Switch()
.ToProperty(this, x => x.Obj);

最新更新