在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
相关产品推荐
相关产品推荐

