我想我在绑定(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?像在更新过程中取消订阅一样?

最佳答案

因此,如果IsPoweredToggleSwitch变为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);
        });

10-08 18:45