在 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
希望对您有所帮助
我正在尝试执行一个命令,以便 运行 从我的视图的构造函数中异步进入一个函数。我知道 运行 在构造函数中异步执行某些操作不一定是好的做法,但我需要在视图打开时加载数据网格,这需要 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
希望对您有所帮助