WPF RadGridView - 如果输入键(但值未更改)就像转义键

WPF RadGridView - If Enter Key (But Value Not Changed) Act Like Escape Key

编辑 RadGridView 中的单元格时,转义键的正常行为是退出编辑模式但保持焦点在同一单元格上;如果按下回车键,则提交编辑并将焦点移至下一个可编辑单元格。

我的老板想让我修改行为,以便在按下回车键但单元格的值没有改变时,将其当作转义键。虽然我已经能够取消提交,但是焦点仍然前进到下一个可编辑的单元格,这不是他想要的。

实现我们所寻求目标的最佳方式是什么?在此先感谢您的帮助。

最简单的方法可能是处理编辑 TextBoxPreviewKeyDown 事件并以编程方式提交编辑并注意其他事项:

private void TextBox_PreviewKeyDown(object sender, KeyEventArgs e)
{
    if (e.Key == Key.Enter)
    {
        e.Handled = true;
        outerGrid.CommitEdit();
    }
}

XAML:

<telerik:GridViewDataColumn>
    <telerik:GridViewDataColumn.CellTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Name}" />
        </DataTemplate>
    </telerik:GridViewDataColumn.CellTemplate>
    <telerik:GridViewDataColumn.CellEditTemplate>
        <DataTemplate>
            <TextBox Text="{Binding Name}" PreviewKeyDown="TextBox_PreviewKeyDown" />
        </DataTemplate>
    </telerik:GridViewDataColumn.CellEditTemplate>
</telerik:GridViewDataColumn>

您当然可以创建自定义 GridViewDataColumn class 来实现此行为:

public class CustomColumn : GridViewDataColumn
{
    public override FrameworkElement CreateCellEditElement(GridViewCell cell, object dataItem)
    {
        TextBox textBox = base.CreateCellEditElement(cell, dataItem) as TextBox;
        textBox.PreviewKeyDown += (s, e) =>
        {
            if (e.Key == Key.Enter)
            {
                e.Handled = true;
                DataControl.CommitEdit();
            }
        };
        return textBox;
    }
}

用法:

<telerik:RadGridView.Columns>
    <local:CustomColumn DataMemberBinding="{Binding Name}" Header="Name" />
</telerik:RadGridView.Columns>