我有一些反应性命令以及一些观察者持有一些信息,我尝试做类似的事情:
_navigate = ReactiveCommand.Create(CanNavigate);
_navigate.CombineLatest(navigationTarget, (_, tgt) => tgt)
.Subscribe(tgt => Navigation.NavigateTo(tgt));
我尝试了几种不同的方法:
SelectMany
Zip
我要么最终:
基本上我想要:
在执行命令时每次触发(和仅)的一个observable,同时拉入第二个observable的最新值。
无法理解如何最好地实现这一目标......
答案 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());
}
答案 1 :(得分:1)
我们使用Join来实现这一行为。
这个想法是,在某个时刻,window
只有一个navigtion target
而_navigate
命令没有窗口。当命令出现时,它从另一个序列的当前打开窗口获取值。当新的navigationTarget
到达时,navigationTarget
值的窗口将关闭。
_navigate.Join(
navigationTarget,
_ => Observable.Empty<Unit>(),
_ => navigationTarget,
(_, tgt) => tgt).Subscribe(tgt => Navigation.NavigateTo(tgt));