【问题标题】:Rx how to combine command with another observableRx 如何将命令与另一个 observable 结合
【发布时间】:2015-07-02 14:56:29
【问题描述】:

我有一些反应性命令以及一些包含一些信息的可观察对象,我正在尝试执行以下操作:

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

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

  1. SelectMany
  2. Zip

我要么最终得到:

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

基本上我想要:

每次执行命令时(并且)触发的可观察对象,同时拉入第二个可观察对象的最新值。

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

【问题讨论】:

    标签: c# wpf system.reactive reactiveui


    【解决方案1】:

    如果您能够使用预发布版本,那么最新 (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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-28
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多