使用ReactiveCommand对IObservable进行采样

时间:2016-03-10 10:15:59

标签: system.reactive reactiveui

通常情况下,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));

1 个答案:

答案 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));
}