Skip to content

R3Command

语言

English

partial 类或结构体的实例方法上使用 [R3Command]MvvmAIO.R3),生成器会在同一 partial 类型上发出公共 ReactiveCommand 属性。

前提

说明
partial 类型声明类型须为 partial,否则 R3SG0001
方法种类实例方法(非 static
特性MvvmAIO.R3.R3Command / R3CommandAttribute
输出SaveCommand 或自定义 CommandName 属性
CanExecute可选;须为同 partial 类型上的 Observable<bool>IObservable<bool>

Observable 事件 API 不要求事件源类型为 partial,仅命令生成需要。

快速开始

csharp
public partial class ShellViewModel
{
    private readonly Observable<bool> _canSave = new(true);

    [R3Command(CanExecute = nameof(_canSave))]
    private async Task Save() { /* ... */ }

    [R3Command]
    private void ExecuteBasic() { }
}

构建后得到 SaveCommandExecuteBasicCommand 等属性,在 WPF / Avalonia 中像普通命令属性一样绑定(例如 Command="{Binding SaveCommand}")。

生成方式

partial 方法上的 [R3Command]


public ReactiveCommand XxxCommand { get; }


内部连接方法体(同步 / 异步 / 带参数)
  • 默认属性名:{方法名}Command
  • CommandName → 自定义属性名
  • CanExecute → 将可观察量传入 ReactiveCommand 构造函数

方法签名矩阵

参数返回类型生成的属性适用场景
voidReactiveCommand简单同步命令
一个 (T)voidReactiveCommand<T>带参同步
Task / ValueTaskReactiveCommand异步
一个 (T)Task / ValueTaskReactiveCommand<T>带参异步
一个 (T)Task<TResult> / ValueTask<TResult>ReactiveCommand<T, TResult>异步带返回值
Task<TResult> / ValueTask<TResult>R3SG1001
两个及以上参数任意R3SG1001
static 方法任意R3SG1001

CanExecute

csharp
[R3Command(CanExecute = nameof(_canSave))]
private async Task Save() { }
问题诊断
找不到成员名R3SG1002
类型不是 Observable<bool> / IObservable<bool>R3SG1003

CanExecute 成员须与命令方法位于同一 partial 类型

异步命令

支持 Task / ValueTask;带 Task<TResult> 的单参数方法生成 ReactiveCommand<T, TResult>

排错

Id处理
R3SG0001将类型改为 partial
R3SG1001调整为矩阵支持的签名
R3SG1002 / R3SG1003修正 CanExecute 成员名或类型
R3SG1004使用不同的 CommandName

详见 诊断参考

在示例中试用

MvvmAIO.R3.SourceGenerators.Samples — 导航 [R3Command] · Commands

示例包含同步、带参、异步命令;同一 ViewModel 亦演示 INotifyPropertyChangedFromEventHandlers() — 见 Observable 事件

延伸阅读

基于 MIT 许可证发布。

基于 MIT 许可证发布。