2014-04-07 24 views
1

我正在嘗試ObservableForProperty用於多個Reactive Observable Sequences。 這是代碼。ObservableForProperty for multiple Reactive Observable Sequence

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更改爲不同類型的三個屬性?

回答

4

我忽略了在這裏使用ObservableForProperty的具體細節 - 只是流的類型不同纔是重要的事實,所以我們可以將其視爲一個香草Rx問題。

如果你有不同類型的流,顯然編譯器不能將它們合併到一個單獨的類型中。您需要指定一個結果選擇器函數作爲CombineLatest的最後一個參數,以告訴它您想如何執行此操作:例如給出以下源流:

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

...然後一個容易的選擇是產生一個匿名類型(只要你不是當然的功能外它返回),例如:

Observable.CombineLatest(xs, ys, zs, (x,y,z) => new { x,y,z }); 
+0

謝謝!這工作:) – Butters

7

這實際上是內置在ReactiveUI已經使用更好的方法比ObservableForProperty,叫WhenAnyValue

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