通常情况下,ReactiveCommand
必须对UI中的数据进行操作,这些数据可以适用于IObservable
。每次命令触发时,都应该对数据源进行采样并对其进行操作。
IObservable<CommandContext> context = ... ;
Command = ReactiveCommand.Create();
context.Sample(Command).Subscribe(c => CommandImpl(c));
障碍是Sample
在上下文不变时不会重新取样。我尝试使用Repeat
解决此问题,但由于Rx是强制性的而不是懒惰的,因此会导致锁定。
contextSelect(c => Observable.Repeat(c)).Switch()
.Sample(Command)
.Subscribe(c => CommandImpl(c));
答案 0 :(得分:2)
您需要的是WithLatestFrom()
方法。 It is available in many Rx flavors,但遗憾的是没有出现在Rx.NET(2.2.5)的最新官方版本中。
如果你有,你的代码可能如下所示:
Command
.WithLatestFrom(context, (_, ctx) => ctx))
.Subscribe(ctx => CommandImpl(ctx));
幸运的是,此appears to be added运算符latest prerelease package of Rx.NET(2.3.0-beta2)。
或者,您可以使用上面链接的github问题中提供的实现之一 - 例如this one by James World(注意 - 我没有测试它):
public static IObservable<TResult> WithLatestFrom<TLeft, TRight, TResult>(
this IObservable<TLeft> source,
IObservable<TRight> other,
Func<TLeft, TRight, TResult> resultSelector)
{
return other.Publish(os =>
source.SkipUntil(os)
.Zip(os.MostRecent(default(TRight)), resultSelector));
}