ReactiveUI: как объединить несколько наблюдений и одно свойство и использовать ToProperty () - PullRequest
0 голосов
/ 09 апреля 2019

Я немного борюсь с моим небольшим проектом на основе ReactiveUI. На этом этапе я закончил с пролбемом, который не был удовлетворительно решен. Конечно, речь идет о прослушивании изменений и реагировании на них.

Итак, у меня хорошая модель View. Давайте назовем это PathViewModel с одним свойством IsEnabled и двумя "моделями подвидов" AnalyzeViewModel и ReactionViewModel. Все модели представлений получены из 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));
...