ReactiveCommand.Execute不会触发IsExecuting

时间:2016-12-21 00:13:11

标签: reactiveui

我订阅了IsExecuting的命令:

LoginCommand.IsExecuting.Subscribe(x => Log("Logging in"));

当InvokeCommand调用我的Command时它工作正常,但是当我通过它调用它时

LoginCommand.Execute();

未触发IsExecuting observable。

这有效:

Observable.Start(() => { }).InvokeCommand(LoginCommand);

有人知道为什么IsExecuting属性在调用Execute方法时没有改变吗?我试图对命令进行单元测试,所以我认为这是从测试中执行它的最佳方式。

2 个答案:

答案 0 :(得分:3)

升级到ReactiveUI 7.0后,Execute()方法已更改。现在它不会立即触发命令。相反,它会返回一个感冒IObservable,你必须订阅它才能让事情发生。

LoginCommand.Execute().Subscribe();

here中检查有关RxUI 7.0中的更改的内容。 Ctrl + F" ReactiveCommand更好"。它明确说明:

  

ReactiveCommand公开的Execute是被动的(它返回IObservable)。因此,它是懒惰的,除非有东西订阅,否则不会做任何事情。

答案 1 :(得分:0)

当您要执行ReactiveCommand时,可以这样做:

RxApp.MainThreadScheduler.Schedule(Unit.Default, (scheduler, state) => 
       ViewModel.MyCommand.Execute(state).Subscribe());

然后您可以像这样订阅它:

this.WhenActivated(d => { 

    MyCommand
        .Select(_ => this)
        .ObserveOn(RxApp.MainThreadScheduler)
        .ExecuteOn(RxApp.TaskScheduler)
        .Subscribe(viewModel => {
            // ... 
        })
        .DisposeWith(d); 
});