代码之家  ›  专栏  ›  技术社区  ›  blcamp

WPF RadGridView-如果输入键(但值未更改)与Escape键类似

  •  1
  • blcamp  · 技术社区  · 7 年前

    在中编辑单元格时 RadGridView ,escape键的正常行为是离开编辑模式,但将焦点保留在同一单元格上;如果按enter键,则提交编辑并将焦点提前到下一个可编辑单元格。

    我的老板想让我修改行为,以便在按下enter键但单元格的值没有更改的情况下,将其视为escape键。虽然我已经能够取消提交,但焦点仍然前进到下一个可编辑的单元格,这不是他想要的。

    实现我们所追求的目标的最佳方式是什么?提前感谢您的帮助。

    1 回复  |  直到 7 年前
        1
  •  2
  •   mm8    7 年前

    最简单的方法可能是处理 PreviewKeyDown 编辑事件 TextBox 并以编程方式提交编辑并执行其他操作:

    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 实现此行为的类:

    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>