我订阅了IsExecuting的命令:
LoginCommand.IsExecuting.Subscribe(x => Log("Logging in"));
当InvokeCommand调用我的Command时它工作正常,但是当我通过它调用它时
LoginCommand.Execute();
未触发IsExecuting observable。
这有效:
Observable.Start(() => { }).InvokeCommand(LoginCommand);
有人知道为什么IsExecuting属性在调用Execute方法时没有改变吗?我试图对命令进行单元测试,所以我认为这是从测试中执行它的最佳方式。
答案 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);
});