簡體   English   中英

多個反應性可觀察序列的ObservableForProperty

[英]ObservableForProperty for multiple Reactive Observable Sequence

我正在嘗試ObservableForProperty獲得多個反應性可觀察序列。 這是代碼。

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)'的類型參數。 嘗試顯式指定類型參數。

關於如何為不同類型的三個屬性進行ObserveForProperty Change的任何想法?

它實際上已經內置在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 });

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM