You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Blazor WASM中如何从EventCallback触发CommunityToolkit MVVM的RelayCommand?

实现EventCallback到RelayCommand的转换

在Blazor WASM中结合CommunityToolkit.Mvvm,你可以通过自定义适配逻辑直接将EventCallback封装为RelayCommand,具体方案如下:

方案1:直接封装(简单无参/固定参数场景)

如果你的EventCallback不需要参数,或者参数类型明确,可直接在ViewModel中用[RelayCommand]特性生成命令,在命令执行方法内调用EventCallback:

// ViewModel代码(继承ObservableObject)
public partial class MyViewModel : ObservableObject
{
    [RelayCommand]
    private async Task TriggerComponentCallback()
    {
        if (ComponentCallback.HasDelegate)
        {
            await ComponentCallback.InvokeAsync();
        }
    }

    // 接收组件传入的EventCallback
    public EventCallback ComponentCallback { get; set; }
}

Blazor组件中绑定命令:

<button @command="ViewModel.TriggerComponentCallbackCommand">触发回调</button>

方案2:通用适配器类(支持带参数的通用场景)

如果需要处理带任意类型参数的EventCallback,可编写一个扩展方法类,将EventCallback直接转换为RelayCommand:

public static class EventCommandAdapter
{
    // 带参数的转换方法
    public static RelayCommand<T> ToRelayCommand<T>(this EventCallback<T> callback)
    {
        return new RelayCommand<T>(async param =>
        {
            if (callback.HasDelegate)
            {
                await callback.InvokeAsync(param);
            }
        });
    }

    // 无参数的转换方法
    public static RelayCommand ToRelayCommand(this EventCallback callback)
    {
        return new RelayCommand(async () =>
        {
            if (callback.HasDelegate)
            {
                await callback.InvokeAsync();
            }
        });
    }
}

使用示例

在ViewModel中直接调用扩展方法转换:

public partial class MyViewModel : ObservableObject
{
    public ICommand MessageCommand { get; }

    public MyViewModel(EventCallback<string> messageCallback)
    {
        // 将组件传入的EventCallback转为RelayCommand
        MessageCommand = messageCallback.ToRelayCommand();
    }
}

Blazor组件中传递EventCallback并绑定命令:

@inject MyViewModel ViewModel

<input type="text" @bind="_inputText" />
<button @command="ViewModel.MessageCommand" @commandparameter="_inputText">发送消息</button>

@code {
    private string _inputText;

    protected override void OnInitialized()
    {
        ViewModel = new MyViewModel(new EventCallback<string>(this, HandleMessageReceived));
        base.OnInitialized();
    }

    private Task HandleMessageReceived(string message)
    {
        // 组件端的回调逻辑
        Console.WriteLine($"收到消息:{message}");
        return Task.CompletedTask;
    }
}

关键注意点

  • 调用EventCallback前需通过HasDelegate判断委托是否有效,避免空委托异常。
  • CommunityToolkit.Mvvm的RelayCommand原生支持异步方法,无需额外处理异步逻辑。
  • 若使用源生成的命令([RelayCommand]特性),直接在命令方法内调用EventCallback的写法更贴合MVVM模式。

内容的提问来源于stack exchange,提问作者Rasmus Christensen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.22 21:57:16