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

.Net Maui Entry失焦绑定EventToCommand抛出InvalidCastException异常

问题根因

抛出System.InvalidCastException和CommunityToolkit.Mvvm源生成器生成IAsyncRelayCommand没有关系——IAsyncRelayCommand本身继承自ICommand接口,完全符合绑定的类型要求。
异常的真正诱因有两个:

  1. EventToCommandBehavior默认会将对应事件的事件参数作为命令入参传递,Unfocused事件的参数类型是FocusEventArgs,但定义的GetDetails方法没有匹配类型的入参,类型转换直接失败抛错。
  2. 异步命令方法错误使用了async void签名,源生成器对异步方法的标准支持是返回Task,async void除了原生事件处理器场景外,用在命令里会导致异步异常无法被正常捕获,存在崩溃风险。
修复方案

根据你是否需要获取失焦事件的参数,二选一即可:

  • 不需要使用事件参数(绝大多数业务场景,仅需要失焦触发逻辑)
    第一步修改XAML,给行为加上PassEventArgsToCommand="False",禁止自动传递事件参数:
    <Entry Margin="10,0,10,0" 
           MaxLength="20"
           IsEnabled="{Binding IsNotBusy}"
           PlaceholderColor="Red">
        <Entry.Behaviors>
            <toolkit:EventToCommandBehavior 
                EventName="Unfocused" 
                Command="{Binding GetDetailsCommand}"
                PassEventArgsToCommand="False"/>
        </Entry.Behaviors>
    </Entry>
    
    第二步修改命令方法签名,将async void改为async Task,符合源生成器的异步命令规范:
    [ICommand]
    public async Task GetDetails() 
    {
        // 编写失焦后要执行的业务逻辑,比如拉取详情数据
    }
    
  • 需要使用失焦事件的参数(比如需要判断焦点状态、焦点移动方向)
    直接修改命令方法,添加FocusEventArgs类型的入参,同时修正异步返回值为Task即可,不需要额外修改XAML的行为配置:
    [ICommand]
    public async Task GetDetails(FocusEventArgs args) 
    {
        // 可直接通过args访问事件参数,比如args.IsFocused获取当前焦点状态
        // 编写业务逻辑
    }
    

注意:不要给无参数的异步命令保留async void签名,这种写法下异步操作中抛出的异常无法被命令的异常处理逻辑捕获,会直接导致应用崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 00:45:44