Я немного борюсь с моим небольшим проектом на основе 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));