gpt4 book ai didi

mvvm - 声明 ReactiveCommand 后如何更新 CanExecute 值

转载 作者:行者123 更新时间:2023-12-03 10:12:42 24 4
gpt4 key购买 nike

我正在使用 ReactiveUIAvaloniaUI并且有一个带有多个 ReactiveCommands 的 ViewModel即扫描、加载和运行。

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 将继续执行。

有没有更好/正确的方法来实现这一点?

最佳答案

But I can't reference the commands' IsExecuting property before is it declared.



一种选择是使用 Subject<T> ,将其作为 canExecute: 传递命令的参数,然后使用 OnNext 发出新值在 Subject<T> .

另一种选择是使用 WhenAnyObservable :
this.WhenAnyObservable(x => x.Run.IsExecuting)
// Here we get IObservable<bool>,
// representing the current execution
// state of the command.
.Select(executing => !executing)

然后,您可以申请 Merge WhenAnyObservable 生成的 observables 的运算符.要跳过初始空值(如果有),请使用 Where运算符(operator)或 .Skip(1) .

关于mvvm - 声明 ReactiveCommand 后如何更新 CanExecute 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58479606/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com