Mvvm 反应式用户界面和双向绑定

Mvvm 反应式用户界面和双向绑定,mvvm,reactive-programming,reactiveui,Mvvm,Reactive Programming,Reactiveui,我想我缺少了绑定和反应式ui如何协同工作的一些东西 这里有一个例子。我有一个ToggleSwitch,它双向绑定到视图模型中的可观察属性: <ToggleSwitch IsOn="{Binding IsPowered, Mode=TwoWay}"/> 当我切换按钮时,这工作正常。但是,假设我在后台线程上执行刷新,并从我的服务器收到一个通知,IsPowered现在为true(以前为false)。我想通知UI中的ToggleSwitch处于正确的状态,因此我设置: IsPowered

我想我缺少了绑定和反应式ui如何协同工作的一些东西

这里有一个例子。我有一个ToggleSwitch,它双向绑定到视图模型中的可观察属性:

<ToggleSwitch IsOn="{Binding IsPowered, Mode=TwoWay}"/>
当我切换按钮时,这工作正常。但是,假设我在后台线程上执行刷新,并从我的服务器收到一个通知,IsPowered现在为true(以前为false)。我想通知UI中的ToggleSwitch处于正确的状态,因此我设置:

IsPowered = true;
但这会触发WhenyValue,它用新值调用我的服务,我不想这样做,因为它在服务中已经是真的了


是否有方法确保WhenyValue仅因用户输入而被调用?比如在更新过程中取消订阅它?

因此,如果
通过
切换开关
启用了
,并且
MyService
设置为false,那么
服务
必须运行代码;否则,如果
IsPowered
MyService
中已为true,
MyService
不得运行该代码

为什么不在MyService.UpdatePowerStatusAsync
中添加一个
if
?比如:

private bool _internalIsPowered;

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

    //here all the code if _internalIsPowered is false

    _internalIsPowered = isPowered;
}
PS:你写了“当开关从Off切换到On时”。。。如果在禁用
IsPowered
时不需要执行
Subscribe
,请使用
Where
子句:

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

据我所知,MyService.UpdatePowerStatusAsync()似乎应该检查是否已设置
this.WhenAnyValue(x => x.IsPowered)
    .Where(isPowered => isPowered) // execute only if the passed parameter is true
    .Subscribe(isPowered => 
        {
            await MyService.UpdatePowerStatusAsync(isPowered);
        });