ReactiveUI:如何合并多个观测值和一个属性并使用ToProperty()

时间:2019-04-09 15:12:32

标签: c# reactiveui

我在基于ReactiveUI的小型项目中战斗了一段时间。在这一阶段,我的问题解决了。当然,这是关于倾听变化并对此做出反应。

所以我有一个不错的View Model。让我们称其为PathViewModel,它具有一个属性IsEnabled和两个“子视图模型” AnalyzeViewModelReactionViewModel。所有视图模型均源自ReactiveObject(如假设)。然后,在PathViewModel上还有一个名为TextView的属性将被设置。一些声明:

public class PathViewModel : ReactiveObject
{
     //.ctor sets sub view models properly
     private readonly ObservableAsPropertyHelper<string> textview;
     public PathAnalyzeViewModel AnalyzeViewModel { get; }
     public PathReactionViewModel ReactionViewModel { get; }
     public bool IsEnabled { get => this.isEnabled; set => this.RaiseAndSetIfChanged(ref this.isEnabled, value); }

     public string TextView => this.textview.Value;

     ....
}

我想做的是:当两个视图模型中的任何一个的任何属性发生更改时,或者IsEnabled发生更改时,都应为TextView分配一些值。

我在.ctor中尝试了以下方法,但它要么无法编译,要么导致属性为TextView

为空
        this.WhenAnyObservable(
            x1 => x1.AnalyzeViewModel.Changed,
            x2 => x2.ReactionViewModel.Changed,
            x3 => x3.ObservableForProperty(x => x.IsEnabled, false, true))
        .Select(f => SomeString()).ToProperty(this, x => x.TextView, out this.textview, string.Empty);

        Observable.CombineLatest(
            this.AnalyzeViewModel.Changed,
            this.ReactionViewModel.Changed,
            this.WhenAnyValue( z => z.IsEnabled).StartWith(true), (p0, p1, p2) => true)
            .Select(f => SomeString()).ToProperty(this, x => x.TextView, out this.textview, string.Empty);

我最终只听了自己的Changed,但这并不令人满意。我尝试通过Where修改属性名称(请参阅注释)来使自己更准确,但这种方法不起作用:

        this.WhenAnyObservable(
            x1 => x1.AnalyzeViewModel.Changed,
            x1 => x1.ReactionViewModel.Changed,
            x1 => x1.Changed)  //.Where(wf => wf.PropertyName == nameof(this.IsEnabled))
            .Select(f => SomeString()).ToProperty(this, x => x.TextView, out this.textview, string.Empty);

那么经验丰富的ReactUI开发人员将如何处理此问题?会很难吗?

这有效,但仅适用于该物业:

IObservable<IObservedChange<PathViewModel, bool>> obsEnabled =    this.ObservableForProperty(x => x.IsEnabled);
   obsEnabled.Subscribe((a) => Console.Write(a.Value));

0 个答案:

没有答案