.Net Maui Entry失焦绑定EventToCommand抛出InvalidCastException异常
问题根因
抛出System.InvalidCastException和CommunityToolkit.Mvvm源生成器生成IAsyncRelayCommand没有关系——IAsyncRelayCommand本身继承自ICommand接口,完全符合绑定的类型要求。
异常的真正诱因有两个:
EventToCommandBehavior默认会将对应事件的事件参数作为命令入参传递,Unfocused事件的参数类型是FocusEventArgs,但定义的GetDetails方法没有匹配类型的入参,类型转换直接失败抛错。- 异步命令方法错误使用了
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
相关产品推荐
相关产品推荐

