在 ReactiveUI 7.2 中手动执行命令

Manually executing a command in ReactiveUI 7.2

我正在尝试执行一个命令,以便 运行 从我的视图的构造函数中异步进入一个函数。我知道 运行 在构造函数中异步执行某些操作不一定是好的做法,但我需要在视图打开时加载数据网格,这需要 3-5 秒,所以我想我可以加载进度条使用 IsLoading 属性 而我的命令在单独的线程上获取数据 运行s。

这是我执行上述操作的命令/属性 声明:

public ReactiveCommand EnterCmd { get; private set; }
ObservableAsPropertyHelper<bool> _isLoading;
public bool IsLoading => _isLoading.Value;

下面是我在构造函数中的实例化:

EnterCmd = ReactiveCommand.CreateFromTask(LoadGridData);
EnterCmd.IsExecuting.ToProperty(this, x => x.IsLoading, out _isLoading);

我想 运行 通过执行类似 EnterCmd.Execute() 的操作来启动我的命令。 值得注意的是,我确实发现了一个类似的问题 ,但是 Execute() 似乎不再是 ReactiveCommand 上的有效方法。任何想法将不胜感激。

Exexute() 方法在版本 7 中发生了变化。它现在 returns 是一个可观察对象,因此您需要订阅它才能工作:

EnterCmd.Execute().Subscribe();

除了 Jon 的回答之外,您需要确保您访问的是 ReactiveCommand<TParam, TResult>,而不仅仅是 ReactiveCommand(这是一个没有执行概念的基础 class) .

因此请确保您的 EnterCmd 属性 类型正确,例如 ReactiveCommand<Unit, Unit>.

实现相同目的的另一种方法是使用方法 InvokeCommand 调用命令。

您可以在以下 link 中找到有关如何使用它的更多信息:Invoking Commands

在 ReactiveUI 中还推荐的一件事是不要在构造函数中执行命令(不是好的测试设计)。相反,尝试像这样从视图调用命令:

this.WhenActivated(disposables =>
{
    this.WhenAnyValue(view => view.ViewModel.LoadData)
        .Select(cmd => Unit.Default)
        .InvokeCommand(this.ViewModel.LoadData)
        .DisposeWith(disposables);                     
});

您可以找到有关此主题的更多信息here

希望对您有所帮助