【问题标题】:How to determine "canExecute" from the CommandParameter with ReactiveUI?如何使用 ReactiveUI 从 CommandParameter 中确定“canExecute”?
【发布时间】:2018-12-19 08:58:51
【问题描述】:

我可以创建一个这样的命令来检查我的视图模型的某些属性是否可以执行:

AddNewSectionCommand = ReactiveCommand
    .CreateFromTask(() => AddNewSectionAsync(NewSectionTitle),
                    this.WhenAny(x => x.NewSectionTitle, x => !string.IsNullOrWhiteSpace(x.Value)));

是否也可以为我通过 WPF 传入的 CommandParameter 执行此操作,如果,如何?因为有时我直接想用 UI 中的东西作为命令的参数,但也想在之前检查有效性。到目前为止,我必须通过将值绑定到视图模型属性并使用上面的方法来做到这一点,这会使我的视图模型变得杂乱无章。

【问题讨论】:

    标签: c# reactiveui


    【解决方案1】:

    不,canExecute 没有 CommandParameter。 vm 属性路由是要走的路。所有 ReactiveUI “入门”类型的示例都一直使用这种方法(例如用户名/密码),这是有道理的,因为 vm 应该负责确定可执行性。主要原因之一是单元测试更容易。所以我觉得添加到 vm 的额外属性非常值得,而且一点也不多余。

    【讨论】:

    • 关于视图模型只能控制什么可以执行,什么不能执行,这绝对是有道理的。过去,我将视图模型和代码混合用于小型、不太复杂的自包含用户控件(例如文本框和按钮,其中按钮打开文件选择器并相应地填充文本框),现在我将对所有内容都使用视图模型。
    • 通常您是否允许执行命令的决定应该基于模型/视图模型的可用数据。例如,您倾向于绑定所选项目,以便查看模型数据。您不会经常查看相关数据。因此,从那个角度来看,将其作为参数不可用是有意义的。
    • 我有一个带有 4 个按钮的日历视图,可以在指定的日期范围内来回移动月份、移动年份。我将所有按钮绑定到相同的命令,分别传递 -1、-12、12 和 1 个月数。命令参数是按钮内嵌的常量值。有没有办法设置可以使用 RxUI 执行,以便检查新计算的日期是否超过允许的日期标准?这是否意味着我别无选择,只能创建 4 个不同的命令?
    • 我遇到了一个类似的问题,结果是多个命令,每个命令对应一个按钮。我所做的是创建一些“虚拟函数”,它们都调用相同的中心函数。像 DoThis("new")、DoThis("edit")、DoThis("whatever") 和最后的函数 DoThis(string doWhat)。我真的很怀念基于 CommandParameter 定义“canExecute”函数的可能性。
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2021-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多