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