使用 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>();