我正在使用ReactiveUI
并AvaloniaUI
拥有一个 ViewModel,其中ReactiveCommands
包括 Scan、Load 和 Run。
更新时调用扫描Observable<string>
(当我从扫描仪收到条形码时)。
加载是从扫描命令中触发的。
从 UI 上的按钮触发运行。
简化代码如下:
var canRun = Events.ToObservableChangeSet().AutoRefresh().ToCollection().Select(x => x.Any());
Run = ReactiveCommand.CreateFromTask<bool>(EventSuite.RunAsync, canRun);
var canLoad = Run.IsExecuting.Select(x => x == false);
var Load = ReactiveCommand.CreateFromTask<string, Unit>(async (barcode) =>
{
//await - go off and load Events.
}, canLoad);
var canReceiveScan = Load.IsExecuting.Select(x => x == false)
.Merge(Run.IsExecuting.Select(x => x == false));
var Scan = ReactiveCommand.CreateFromTask<string, Unit>(async (barcode) =>
{
//do some validation stuff
await Load.Execute(barcode)
}, canReceiveScan);
Barcode
.SubscribeOn(RxApp.TaskpoolScheduler)
.ObserveOn(RxApp.MainThreadScheduler)
.InvokeCommand(Scan);
只有在没有其他命令正在运行(包括其自身)时,才能执行每个命令。但是我不能IsExecuting
在声明之前引用命令的属性。所以我一直在尝试合并“CanExecute”可观察变量,如下所示:
canRun = canRun
.Merge(Run.IsExecuting.Select(x => x == false))
.Merge(Load.IsExecuting.Select(x => x == false))
.Merge(Scan.IsExecuting.Select(x => x == false))
.ObserveOn(RxApp.MainThreadScheduler);
// same for canLoad and canScan
我遇到的问题是 ReactiveCommand 将在另一个命令执行时继续执行。
有没有更好/正确的方法来实现这一点?