2016-05-17 48 views
2

我想我錯過了綁定和響應式UI如何協同工作。反應式用戶界面和雙向綁定

下面是一個例子。我有這勢必雙向以可觀察到的財產在我的視圖模型一個ToggleSwitch:

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

當開關被從關切換 - >在我要執行一段代碼,所以我做到以下幾點:

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

這個工作正常,當我切換按鈕。但是,假設我在後臺線程上執行刷新,並從我的服務器獲取IsPowered現在爲true(以前爲false)的通知。我想通知ToggleSwitch在UI是在正確的狀態,所以我設置:

IsPowered = true; 

但是,然後觸發它調用我的新價值,這是我不想這樣做,因爲服務WhenAnyValue這在服務中已經是真的了。

無論如何要確保WhenAnyValue只是由於用戶輸入而被調用嗎?喜歡在更新期間退訂嗎?

+0

從我的閱讀,看來MyService.UpdatePowerStatusAsync()應該檢查它是否已經設置 – kenny

回答

1

所以,如果IsPowered成爲從ToggleSwitchMyService真有它假,那麼Service必須運行的代碼;否則,如果IsPowered已經在MyService中成立,則MyService不得運行該代碼。

爲什麼不把if放在MyService.UpdatePowerStatusAsync?喜歡的東西:

private bool _internalIsPowered; 

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

    //here all the code if _internalIsPowered is false 

    _internalIsPowered = isPowered; 
} 

PS:你寫了「當開關被從關閉切換 - >在」 ......如果你不需要Subscribe執行時IsPowered是關閉的,使用Where條款:

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