1

我对 Rx 还是很陌生,很难弄清楚如何表达这个(看似)简单的订阅。我正在寻找这样的东西:

  1. 开始: InTransaction.Where(inTransaction => inTransaction)
  2. 如果:ItemChanged 或 On FlagChanged,让 Changed = true
  3. 结束: InTransaction.Where(inTransaction => !inTransaction)

以上都是可观察的。因此,在交易开始时,我想开始关注更改通知,无论有多少进来,我只想记住已经收到任何通知。当事务结束时,我想调用我的处理程序来更新视觉状态。

网上有很多有趣的例子展示了如何为鼠标拖动执行此操作。我遇到的唯一问题是我不想获得每一个更改的事件。我想知道在交易结束之前是否有任何被击中。

谁能帮我指出正确的轨道?

更新:我当前的算法看起来像这样:

bool pendingRefresh = false;

Observable
    .Merge(
        _selectionChanged,
        _objectManager
            .PropertiesChanged
            .Where(objects => objects.Contains(_selectedObject)))
    .Subscribe(_ => pendingRefresh = true);

_actionManager
    .IsInTransaction.Where(isIn => !isIn)
    .Throttle(TimeSpan.FromSeconds(0.15))
    .Subscribe(_ => 
        {
            if (pendingRefresh)
            {
                pendingRefresh = false;
                Refresh();
            }
        });

工作正常,但我想知道我是否可以通过一次订阅来摆脱困境。

4

1 回答 1

3

看起来你在正确的轨道上。如果您不关心有多少更改通知进来,请查看 Any 运算符:

public static IObservable<bool> Any<TSource>(this IObservable<TSource> source)

这只会触发一次,当第一条消息进入时,它将触发 true,如果 OnCompleted 发生而没有任何消息进入,它将触发 false。

希望这可以帮助。

杰弗里

于 2010-06-23T18:37:03.430 回答