[Reactive Extensions][Reactive Property][C#] 依存するいずれかのプロパティが変更された時に、リアクティブにプロパティを更新する


ちょっとタイトルわかりにくいですが以下のようなケースです。

A, B, C のいずれかの変数の更新がされたら自動的に X を更新したい。
更新された変数以外は最後の値を使用したい。

使用例としては、ツールバーや設定画面で特定機能の有効/無効の切り替えを行った場合に画面の再描画を行なうなどが考えられます。

どう実現するか

Reactive Property の前提技術である Reactive Extentions には CombineLatest というそのままの機能があります。


ReactiveX - CombineLatest operator

ReactivePropertyで利用する例

ReactiveProperty で利用する場合には以下のようにします。2つ以上の場合でも問題なく利用できます。

ReactiveProperyで利用する例
RxPropA = model.PropA.ToReactiveProperty();
RxPropB = model.PropB.ToReactiveProperty();
RxPropC = model.PropC.ToReactiveProperty();

ReadOnlyRxPropX = RxPropA
    .CombineLatest(RxPropB, RxPropC, (rxPropA, rxPropB, rxPropC) => ConvertToX(rxPropA, rxPropB, rxPropC))
    .ToReadOnlyReactiveProperty();

これでA, B, Cのいずれかの状態更新でリアクティブにXを更新することができます。

参考