首页 > 解决方案 > 当用户在 RadGridView 中按 Enter 时,防止跳转到下一行

问题描述

我有一个RadGridView来自 Telerik UI for WPF 的可编辑列。当用户编辑该列中的单元格并点击Enter时,网格中下一行中的同一单元格将获得焦点。

我希望用户刚刚编辑的单元格失去焦点。如何做到这种 MVVM 风格?

标签: wpf.net-coredatagridteleriklost-focus

解决方案


您可以通过编写自定义键盘命令提供程序来更改此行为。此提供程序会覆盖默认的Enter按下操作。SelectedItem它通过将 设置为来提交编辑并取消选择单元格null

public class CustomKeyboardCommandProvider : DefaultKeyboardCommandProvider
{
   private readonly GridViewDataControl _grid;

   public CustomKeyboardCommandProvider(GridViewDataControl grid)
      : base(grid)
   {
      _grid = grid;
   }

   public override IEnumerable<ICommand> ProvideCommandsForKey(Key key)
   {
      var commands = base.ProvideCommandsForKey(key).ToList();

      if (key != Key.Enter)
         return commands;

      commands.Clear();
      commands.Add(RadGridViewCommands.CommitEdit);

      _grid.SelectedItem = null;

      return commands;
   }
}

您必须分配新的提供者。最简单的方法是在代码隐藏中,因为它有一个构造函数参数。

MyRadDataGridView.KeyboardCommandProvider = new CustomKeyboardCommandProvider(TestGridView);

或者,创建一个TriggerAction<RadGridView>并将其附加到Loaded网格视图的事件。

public class SetCustomKeyboardCommandProviderAction : TriggerAction<RadGridView>
{
   protected override void Invoke(object parameter)
   {
      AssociatedObject.KeyboardCommandProvider = new CustomKeyboardCommandProvider(AssociatedObject);
   }
}
<telerik:RadGridView>
   <b:Interaction.Triggers>
      <b:EventTrigger EventName="Loaded">
         <local:SetCustomKeyboardCommandProviderAction/>
      </b:EventTrigger>
   </b:Interaction.Triggers>
   <!-- ...other definitions. -->
</telerik:RadGridView>

推荐阅读