使用 Reactive Bindings 将 2 个反应属性组合成一个反应命令
Combine 2 reactive properties into a reactive command with Reactive Bindings
我对这种响应式扩展并不熟悉,但我发现它有一些非常有用的东西。
我真正喜欢的一件事是能够将 bool 属性 转换为在该条件下执行的命令。
例如,如果我对与门的交互进行建模,我的视图模型中会有这样的东西:
public ReactiveProperty<bool> IsOpen{ get; }
和
public ReactiveCommand<bool> SetIsLocked { get; }
那么我可以这样做:
this.SetIsLocked = this.IsOpen.Select(isOpen => !isOpen).ToReactiveCommand<bool>();
this.SetIsLocked .Subscribe(isLocked => this.Door.IsLocked = isLocked );
这会生成一个命令,每次 IsOpen
标志更改时都会更新它的 CanExecute
,并在调用时在我的门上设置适当的值。
但是如果我添加另一个也是 bool 的标志,就像这样说:
public ReactiveProperty<bool> HasLock{ get; }
现在我希望我的命令在门有锁且已关闭时执行,但我还没有找到任何方法来做到这一点。
你们中的一些人可能会说我可以通过创建另一个反应式 属性 来做到这一点,这种反应式将两者融合在一起,我知道我可以让它以这种方式工作,但我想知道的是,如果有通过合并 IObservables 来做到这一点的方法以及类似的语法是什么。
我想你可以这样使用 CombineLatest
:
SetIsLocked =
IsOpen
.CombineLatest(
HasLock,
(open,has_lock) => !open && has_lock)
.ToReactiveCommand<bool>();
我对这种响应式扩展并不熟悉,但我发现它有一些非常有用的东西。
我真正喜欢的一件事是能够将 bool 属性 转换为在该条件下执行的命令。
例如,如果我对与门的交互进行建模,我的视图模型中会有这样的东西:
public ReactiveProperty<bool> IsOpen{ get; }
和
public ReactiveCommand<bool> SetIsLocked { get; }
那么我可以这样做:
this.SetIsLocked = this.IsOpen.Select(isOpen => !isOpen).ToReactiveCommand<bool>();
this.SetIsLocked .Subscribe(isLocked => this.Door.IsLocked = isLocked );
这会生成一个命令,每次 IsOpen
标志更改时都会更新它的 CanExecute
,并在调用时在我的门上设置适当的值。
但是如果我添加另一个也是 bool 的标志,就像这样说:
public ReactiveProperty<bool> HasLock{ get; }
现在我希望我的命令在门有锁且已关闭时执行,但我还没有找到任何方法来做到这一点。
你们中的一些人可能会说我可以通过创建另一个反应式 属性 来做到这一点,这种反应式将两者融合在一起,我知道我可以让它以这种方式工作,但我想知道的是,如果有通过合并 IObservables 来做到这一点的方法以及类似的语法是什么。
我想你可以这样使用 CombineLatest
:
SetIsLocked =
IsOpen
.CombineLatest(
HasLock,
(open,has_lock) => !open && has_lock)
.ToReactiveCommand<bool>();