2014-04-07 4 views
1

Я пытаюсь использовать ObservableForProperty для нескольких реактивных наблюдаемых последовательностей. Вот код.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>(); 

Здесь Т 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 }); 
Смежные вопросы