如何在 ReactiveUI 7 中正确直接调用 ReactiveCommand.Execute()?

2024-01-17

我正在尝试将我的项目从 ReactiveUI 6.5 转换为版本 7。在旧版本中我调用

// var command = ReactiveCommand.Create...;
// ...
if(command.CanExecute(null))
    command.Execute(null);

为了从我的代码后面执行命令。

现在 CanExecute 方法不再可用,并替换为以下属性IObservable<bool>。如果我只是调用 CanExecute Observable 是否会自动调用Execute().Subscribe()或者我必须明确地调用它?

现在我将上面的代码替换为

command.Execute().Subscribe();

我找到了三种不同的解决方案来调用我的命令CanExecute and Execute像我之前在 ReactiveUI 6.5 中一样的方法:

Option 1

这与 6.5 版本中的调用相同,但我们需要显式地将命令转换为 ICommand:

if (((ICommand) command).CanExecute(null))
    command.Execute().Subscribe();

Option 2

if(command.CanExecute.FirstAsync().Wait())
    command.Execute().Subscribe()

或异步变体:

if(await command.CanExecute.FirstAsync())
    await command.Execute()

Option 3

另一种选择是让我们InvokeCommand扩展方法。

Observable.Start(() => {}).InvokeCommand(ViewModel, vm => vm.MyCommand);

这尊重命令的可执行性,如中提到的文档 https://docs.reactiveui.net/en/user-guide/commands/invoking-commands.html.


为了使它更舒适,我编写了一个小的扩展方法来提供ExecuteIfPossible and a GetCanExecute method:

public static class ReactiveUiExtensions
{
    public static IObservable<bool> ExecuteIfPossible<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) =>
        cmd.CanExecute.FirstAsync().Where(can => can).Do(async _ => await cmd.Execute());

    public static bool GetCanExecute<TParam, TResult>(this ReactiveCommand<TParam, TResult> cmd) =>
        cmd.CanExecute.FirstAsync().Wait();
}

您可以按如下方式使用此扩展方法:

command.ExecuteIfPossible().Subscribe();

注意:您需要Subscribe()最后调用,就像您需要调用Execute(),否则什么也不会发生。

或者,如果您想使用 async 和 wait:

await command.ExecuteIfPossible();

如果你想检查一个命令是否可以执行,只需调用

command.GetCanExecute()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ReactiveUI 7 中正确直接调用 ReactiveCommand.Execute()? 的相关文章

随机推荐

  • 将数据文件添加到 cmake 生成的项目中

    我有一个项目 其中源文件位于 source 中 一些着色器文件位于 data 中 这些文件未编译 而是由代码加载 我希望这些文件显示在我的 CMake 生成的 VS2010 项目文件中 以便我可以轻松地编辑它们 有什么好的方法可以做到这一点
  • 在 XNA 中使用 HTML/CSS 作为 UI?

    有没有办法使用 HTML CSS 来做 XNA 游戏的用户界面 我需要以编程方式更新 HTML 以及处理事件 或者我应该使用另一个框架 该线程看起来很有希望 XNA 的 UI 库 https stackoverflow com questi
  • 将 int 列表传递给 HttpGet 请求

    我有一个结构与此类似的函数 HttpGet public HttpResponseMessage GetValuesForList List
  • java.io.IOException:无效的 Http 响应

    现在 在你说有这样的问题之前 我想指出我已经浏览了其中的大多数问题 但没有任何运气 另外 我是第一次来这里 所以要温柔 我现在在当前的程序中遇到了这个烦恼 基本上我的程序的这一部分使用搜索引擎来查找 torrent 文件 public st
  • 如何建立自己的PEAR频道?

    我正在寻找有关如何为我们的项目设置 PEAR 通道的说明 以便我们可以使用 pear 安装程序来部署它 我在网上搜索了一段时间 找不到任何简单的信息 我跟着本教程 http greg chiaraquartet net archives 1
  • 隐藏或显示子报表

    我有一个要求 需要显示或隐藏子报告基于用户选择 假设我有一个主报告和两个子报告 sub1 and sub2 用户选择仅显示sub1 布尔值将通过Java 我需要显示主要报告sub1并隐藏在其中sub2 I tried
  • java中合并排序的问题

    我是 stackoverflow 的新手 我需要一些帮助来编写一个程序来对可比数组列表进行合并排序 我已经在这段代码上工作了几个小时 但没有成功 该程序需要正确运行 因为我正在为计算机科学课程做它 而下一个作业要求我们测试不同类型的效率 这
  • 发送自定义 IQ 时来自服务器的服务不可用响应

    我正在尝试从 android 发送带有 IQ 的自定义信息 所以我使用下面的代码来发送自定义 IQ 消息 public void onClick View arg0 CustomIQ req new CustomIQ req myData
  • Firefox 中的“您的证书”存储在哪里?

    我应该在 Firefox 的 我的证书 部分安装一些证书 但那里没有 如果我能找出存储的位置 也许在我的配置文件目录中的某个地方 那么我可以尝试从备份中恢复 这将是一个更好的问题http superuser com http superus
  • 核心数据 - 无法将空字符串设置为属性的默认值

    我的数据模型中有一个实体 其字符串属性当前是可选的 我想将其转换为默认值为空字符串的必需属性 正如其他人发现的那样 在 Xcode Core Data 数据建模器中将默认值留空会导致验证错误 因为设计者将其解释为 NULL 但尝试将 或 作
  • Dagger 2 注入两个改造对象

    我在使用 MVP 时将 Dagger 2 与 Retrofit2 库结合使用 一切都很顺利 直到我尝试集成另一个服务 基本上我尝试将另一个改造对象初始化到另一个服务 我跟着这个answer https stackoverflow com q
  • NuxtJS - 在布局或组件中使用 asyncData 方法

    我如何使用asyncData在布局或组件中 显然被禁止 因为我的侧边栏组件是在默认布局中使用的 所以我需要使用asyncData显示来自后端的数据 如果我使用 Vuex 来获取数据 我不知道如何在每个页面上使用全局来获取数据 我的布局组件注
  • 将 DIV 更改为“position:fixed”,然后将其更改回“static”并显示其余的 DIV

    我有几个 div 经过一些滚动后 第二个 div 将是 position fixed 再次滚动后 它将回到 position static 但问题是 接下来是第四个 div 而不是第三个 因为当我们在第二个 div 时它已经通过滚动过去了
  • YouTube API v3.0:如何确定视频是否“按次付费”?

    我正在使用YouTube Python API v3 0 使用特定视频 ID 查询 YouTube 我想知道结果中列出的哪些视频是付费内容 其中有一些电视节目 我已经浏览了 视频 对象参数 https developers google c
  • 使用 libsox 对 wav 文件进行降采样

    我正在尝试使用 Sox 库 C 程序将 16KHZ 16 位签名 PCM 编码波形文件转换为 8KHz 8 位 mu 编码 wav 文件 http sox sourceforge net http sox sourceforge net 从
  • 跳过 C++ 函数中的一些参数?

    我有一个 C 函数 有 5 个参数 所有参数都有默认值 如果我传入前三个参数 程序将为最后两个参数分配一个默认值 有没有办法传递 3 个参数 并跳过中间的一个 给出第一个 第二个和第五个参数的值 不直接 但你也许可以使用 std bind
  • 使用访问令牌在私人存储库上获取 Github GET

    我的组织中有一个私人存储库 我需要提供访问权限 我希望能够通过 GET 请求 浏览器 访问文件 我没有终端或卷曲或任何其他工具 我创建了一个链接到我的组织的虚拟帐户 我去了https github com settings tokens h
  • 如何调整 Spring Data JDBC 的 NamingStrategy

    我如何调整 Spring Data JDBCNamingStrategy表现得像 Hibernate 一样PhysicalNamingStrategy 我有以下实体 Campus domain model class Handles inf
  • 是否可以制作 HTML 标签? [复制]

    这个问题在这里已经有答案了 是什么阻止我这样做
  • 如何在 ReactiveUI 7 中正确直接调用 ReactiveCommand.Execute()?

    我正在尝试将我的项目从 ReactiveUI 6 5 转换为版本 7 在旧版本中我调用 var command ReactiveCommand Create if command CanExecute null command Execut