我想我在绑定(bind)和响应式(Reactive)ui协同工作方面缺少一些东西。
这是一个例子。我有一个ToggleSwitch,它绑定(bind)到 View 模型中的可观察属性的两种方式:
<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?像在更新过程中取消订阅一样?
最佳答案
因此,如果IsPowered
从ToggleSwitch
变为true,并且MyService
使其为false,则Service
必须运行该代码;否则,如果IsPowered
中的MyService
已经为true,则MyService
不得运行该代码。
为什么不在if
中放入MyService.UpdatePowerStatusAsync
?就像是:
private bool _internalIsPowered;
UpdatePowerStatusAsync(bool isPowered)
{
if (_internalIsPowered)
return;
//here all the code if _internalIsPowered is false
_internalIsPowered = isPowered;
}
PS:您写了“当开关从Off切换到On时” ...如果在
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);
});