私はまだRxにかなり慣れておらず、この(一見)単純なサブスクリプションを表現する方法を理解するのに苦労しています。私はこのようなものを探しています:
- 開始:InTransaction.Where(inTransaction => inTransaction)
- 次の場合:ItemChangedまたはOn FlagChangedの場合、Changed=trueとします。
- 終了: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つのサブスクリプションで解決できるかどうか疑問に思いました。