我在基于ReactiveUI的小型项目中战斗了一段时间。在这一阶段,我的问题解决了。当然,这是关于倾听变化并对此做出反应。
所以我有一个不错的View Model。让我们称其为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));