Rx如何将命令与另一个observable结合起来

时间:2015-07-01 17:33:04

标签: c# wpf system.reactive reactiveui

我有一些反应性命令以及一些观察者持有一些信息,我尝试做类似的事情:

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

我尝试了几种不同的方法:

  1. SelectMany
  2. Zip
  3. 我要么最终:

    1. 订阅在第一次停止后调用(如果我使用Zip)
    2. 即使命令在执行一次后没有执行,订阅也会调用
    3. 基本上我想要:

        

      在执行命令时每次触发(和)的一个observable,同时拉入第二个observable的最新值。

      无法理解如何最好地实现这一目标......

2 个答案:

答案 0 :(得分:6)

如果您能够使用预发布版本,则最新版本(2.3.0-beta2)具有完全相同的方法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

答案 1 :(得分:1)

我们使用Join来实现这一行为。

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

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