WPF(VB.Net) RadGridView绑定KeyUp命令仅触发Delete键问题排查
问题出在哪?
你现在的配置只是把KeyUp事件绑定到了删除命令,但完全没对触发事件的按键做过滤——不管你按的是Delete、Enter还是空格,只要按键抬起触发了KeyUp事件,命令就会执行。这就是为啥所有按键都能触发删除的原因。
几种解决办法
方法一:命令里直接判断按键(最快上手)
先改XAML,把按键事件的参数传给命令:
<telerik:EventToCommandBehavior.EventBindings> <telerik:EventBinding Command="{Binding CommandDeleteFolderRSP}" EventName="KeyUp" PassEventArgsToCommand="True" /> </telerik:EventToCommandBehavior.EventBindings>
然后在VB.Net的命令代码里,先检查是不是Delete键再执行逻辑:
Public Class CommandDeleteFolderRSP Implements ICommand ' 这里省略ICommand的其他必备实现(CanExecute、CanExecuteChanged等) Public Sub Execute(parameter As Object) Implements ICommand.Execute Dim keyArgs = TryCast(parameter, KeyEventArgs) ' 只有当按键是Delete时才执行删除 If keyArgs IsNot Nothing AndAlso keyArgs.Key = Key.Delete Then ' 这里写你的删除选中行逻辑 ' 比如获取GridView选中项然后处理删除操作 End If End Sub End Class
方法二:用转换器分离判断逻辑(更优雅)
如果不想把按键判断写在命令里,可以整个转换器来过滤:
- 先写转换器类:
Public Class KeyFilterConverter Implements IValueConverter Public Function Convert(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.Convert Dim args = TryCast(value, KeyEventArgs) ' 只有按键是Delete时,才传你要的参数,否则返回空 If args IsNot Nothing AndAlso args.Key = Key.Delete Then Return parameter End If Return Nothing End Function Public Function ConvertBack(value As Object, targetType As Type, parameter As Object, culture As Globalization.CultureInfo) As Object Implements IValueConverter.ConvertBack Throw New NotImplementedException() End Function End Class
- 在XAML里添加这个转换器资源:
<Window.Resources> <local:KeyFilterConverter x:Key="KeyFilterConverter" /> </Window.Resources>
- 修改EventBinding配置:
<telerik:EventToCommandBehavior.EventBindings> <telerik:EventBinding Command="{Binding CommandDeleteFolderRSP}" EventName="KeyUp" PassEventArgsToCommand="True" EventArgsConverter="{StaticResource KeyFilterConverter}" EventArgsConverterParameter="Delete" /> </telerik:EventToCommandBehavior.EventBindings>
- 最后命令里判断参数不为空就执行:
Public Sub Execute(parameter As Object) Implements ICommand.Execute If parameter IsNot Nothing AndAlso parameter.ToString() = "Delete" Then ' 执行删除逻辑 End If End Sub
方法三:改用原生KeyBinding(最推荐)
其实对于按键触发命令的场景,WPF原生的KeyBinding比EventToCommandBehavior更合适,配置更简洁,还自带按键过滤:
<telerik:RadGridView> <telerik:RadGridView.InputBindings> <KeyBinding Command="{Binding CommandDeleteFolderRSP}" Key="Delete" CommandParameter="Delete" /> </telerik:RadGridView.InputBindings> <!-- 你的GridView其他配置 --> </telerik:RadGridView>
这样写的话,只有按下Delete键时才会触发命令,完全不用额外写判断逻辑,省心多了!
内容的提问来源于stack exchange,提问作者user7884267
相关产品推荐
相关产品推荐

