Rx如何将命令与另一个observable组合

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

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

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

  1. SelectMany
  2. Zip

我要么最终得到:

  1. 订阅在第一次停止后调用(如果我使用Zip)
  2. 即使命令在执行一次后仍未执行,订阅也会调用

基本上我想要:

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

不能完全理解如何最好地实现这一目标……

如果您能够使用预发布版本,则最新版本(2.3.0-beta2)具有WithLatestFrom方法。

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

如果没有,您可以通过以下方式创建自己的:

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

资源

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

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

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