2015-07-01 26 views
1

我已经得到了一些功指令以及一些观测持有的一些信息结合起来,和我想要做这样的事情:的Rx如何命令与另一可观察

_navigate = ReactiveCommand.Create(CanNavigate); 
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt) 
    .Subscribe(tgt => Navigation.NavigateTo(tgt)); 

我试着几个不同的方法:

  1. SelectMany
  2. Zip

我要么结束:

  1. 订阅停止在第一时间之后调用(如果我使用邮编)
  2. 订阅甚至当它被执行之后
一旦还没有被执行的命令调用

基本上我想:

可观察到触发每一次(和)时,已经执行的命令,沿着机智h拉第二个可观察值的最近值。

不能完全得到我的头围绕如何最好地实现这个...

回答

5

如果你能够使用一个预发布版本的最新版本(2.3.0-β2)的方法WithLatestFrom这正是这个。

_navigate.WithLatestFrom(navigationTarget, (_, tgt) => tgt) 
    .Subscribe(tgt => Navigation.NavigateTo(tgt)); 

如果没有,你可以通过做创建自己:

public static IObservable<TResult> WithLatestFrom<TLeft, TRight, TResult>(
    this IObservable<TLeft> source, 
    IObservable<TRight> other, 
    Func<TLeft, TRight, TResult> resultSelector) 
{ 
    return source.Publish(os => 
     other.Select(a => os 
      .Select(b => resultSelector(b,a))) 
      .Switch()); 
} 

Source

+0

这没有窍门!特别感谢实施。 – Clint

1

我们用Join来实现这一目标behavoir。

这个想法是,在某一刻你有一个windownavigtion target和没有窗口为_navigate命令。当出现命令时,它将从另一个序列的当前打开窗口获取值。当新的navigationTarget到达时,值为navigationTarget的窗口关闭。

_navigate.Join(
    navigationTarget, 
    _ => Observable.Empty<Unit>(), 
    _ => navigationTarget, 
    (_, tgt) => tgt).Subscribe(tgt => Navigation.NavigateTo(tgt)); 
相关问题