2016-05-17 26 views
2

私は、バインディングとリアクションUIがどのように連携するかについて何か不足していると思います。リアクションUIと双方向バインディング

例を示します。私は私のビューモデルで観察可能なプロパティに双方向にバインドされているToggleSwitchを持っている:スイッチがオフから切り替えます

<ToggleSwitch IsOn="{Binding IsPowered, Mode=TwoWay}"/> 

- >私は、コードの一部を実行したいので、私は、次の操作を行います。

this.WhenAnyValue(x => x.IsPowered).Subscribe(isPowered => 
{ 
    await MyService.UpdatePowerStatusAsync(isPowered); 
}); 

ボタンをトグルするとうまくいきます。しかし、バックグラウンドスレッドでリフレッシュを実行し、IsPoweredがtrue(以前はfalse)だったという通知をサーバーから取得するとします。私は私が設定して右の状態になるようにUIにToggleSwitchを通知したい:

IsPowered = true; 

しかし、それは、私はしたくない新しい価値を持つ私のサービスを呼び出すWhenAnyValueをトリガーするためそれはすでにサービスで本当です。

WhenAnyValueがユーザーの入力によってのみ呼び出されるようにするにはどうしてですか?更新中や何かの間に購読を解除するように?

+0

myReaderから、MyService.UpdatePowerStatusAsync()が既に設定されているかどうかを確認する必要があります – kenny

答えて

1

したがってToggleSwitchMyServiceからtrueになると、Serviceはコードを実行する必要があります。そうでない場合にIsPoweredが既に該当する場合、MyServiceはコードを実行してはなりません。

ifMyService.UpdatePowerStatusAsyncに入れてみませんか?

private bool _internalIsPowered; 

UpdatePowerStatusAsync(bool isPowered) 
{ 
    if (_internalIsPowered) 
     return; 

    //here all the code if _internalIsPowered is false 

    _internalIsPowered = isPowered; 
} 

PS:何かのようにあなたが書いた - ...「スイッチがオフから切り替えるなったとき>オン」IsPoweredがオフのときにWhere句を使用し、Subscribe実行を必要としない場合:

this.WhenAnyValue(x => x.IsPowered) 
    .Where(isPowered => isPowered) // execute only if the passed parameter is true 
    .Subscribe(isPowered => 
     { 
      await MyService.UpdatePowerStatusAsync(isPowered); 
     }); 
関連する問題