多个反应式可观察序列的 ObservableForProperty

本文关键字:ObservableForProperty 观察 反应式 | 更新日期: 2023-09-27 17:57:17

我正在尝试为多个反应式可观察序列提供可观察属性。这是代码。

using ReactiveUI;
public ReactiveUIDerivedClass<T> FName {get; private set;}
public ReactiveUIDerivedClass<T> MName {get; private set;}
public ReactiveUIDerivedClass<T> LName {get; private set;}
FName = new ReactiveUIDerivedClass<T>();
MName = new ReactiveUIDerivedClass<T>();
LName = new ReactiveUIDerivedClass<T>();

这里 T 是 System.String因此,以下方法有效。

private void ObserveForPropertyInThreeFields()
{
  Observable.CombineLatest(FName.ObservableForProperty(p => p.Value),
                           MName.ObservableForProperty(p => p.Value),
                           LName.ObservableForProperty(p => p.Value))
            .Where(p => p.All(v => !string.IsNullOrWhiteSpace(v.Value)))
            .Subscribe(p => { /* do some stuff */ } );
}

现在,我想获得类似的结果,其中属性的 T 具有三种不同的类型。当我使用 Observable.CombineLatest 时,我收到以下错误消息。

方法'System.Reactive.Linq.Observable.CombineLatest(System.IObservable, System.IObservable,System.Func)'不能从用法中推断出来。尝试显式指定类型参数。

关于如何观察三个不同类型的属性的属性变化的任何想法?

多个反应式可观察序列的 ObservableForProperty

实际上已经内置到ReactiveUI中,使用比ObservableForProperty更好的方法,称为WhenAnyValue

this.WhenAnyValue(x => x.FName, x => x.MName, x => x.LName, 
    (first,middle,last) => new { first, middle, last });

我在这里省略了使用ObservableForProperty的具体细节 - 重要的是流的类型不同,因此我们可以将其视为香草Rx问题。

如果您有不同类型的流,那么编译器显然无法将它们合并为单个类型本身。您需要指定一个结果选择器函数作为最终参数,以CombineLatest告诉它您希望如何执行此操作:例如,给定以下源流:

IObservable<T1> xs;
IObservable<T2> ys;
IObservable<T3> zs;

。那么一个简单的选择是生成一个匿名类型(当然,只要你没有在函数之外返回它),例如:

Observable.CombineLatest(xs, ys, zs, (x,y,z) => new { x,y,z });
相关文章:
  • 没有找到相关文章