2016-05-17 49 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); 
     });