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();
            }
        });

正常に動作しますが、1つのサブスクリプションで解決できるかどうか疑問に思いました。

4

1 に答える 1

3

あなたは正しい軌道に乗っているようです。変更通知が何回来るか気にしない場合は、Any 演算子を見てください。

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

これは 1 回だけ発生し、最初のメッセージが入った瞬間に true になります。メッセージが入らずに OnCompleted が発生した場合は false になります。

お役に立てれば。

ジェフリー

于 2010-06-23T18:37:03.430 に答える