扩展WPF的DataGrid如同Excel支持方向键移动焦点

WPF的DataGrid默认的移动行为如下:

(1)当前单元格不处于编辑状态时可使用方向键移动焦点。

(2)当前单元格处于编辑状态时不可使用方向键移动焦点;
按Enter键,当前单元格退出编辑状态,焦点向下移动一格;
按Ctrl+Enter键,当前单元格退出编辑状态,焦点向上移动一格;
按Tab键,当前单元格退出编辑状态,焦点向右移动一格,并进入编辑状态;
按Shift+Tab键,当前单元格退出编辑状态,焦点向左移动一格,并进入编辑状态;

“运营管理3.0″的用户普遍电脑操作水平低下,Office是它们操作的最多也是最智能的软件,它们认为所有的软件都必须是Office一样地操作,否则就给差评,所以它们要求”运营管理”的操作方式尽量与Excel相同.

为了实现WPF的DataGrid的移动方式与Excel相同,需要重写DataGrid的OnPreviewKeyDown事件:

public class ExDataGrid : DataGrid
    {
        protected override void OnPreviewKeyDown(KeyEventArgs e)
        {
            if (e.Key == Key.Left || e.Key == Key.Right || e.Key == Key.Up || e.Key == Key.Down)
            {
                try
                {
                    base.CommitEdit();
                }
                catch (Exception ex)
                {
                    base.CancelEdit();

                    string mess = ex.Message;
                    if (ex.InnerException != null)
                        mess += "nn" + ex.InnerException.Message;
                    MessageBox.Show(mess);
                }
            }

            base.OnPreviewKeyDown(e);
        }
    }

然后在使用DataGrid的地方换成已重写的ExDataGrid就可以了.

WPF DataGrid神异的现象

一个WPF的DataGrid,绑定到一个集合List<MyClass>,模式为OneWay,从DataGrid里选择一行,传递到另个弹出页面,并绑定到TextBox等控件,模式为TwoWay,这个神异的现象是这样子的:

我添加了两条测试数据到List<MyClass>集合里,这时DataGrid显示两条记录,我选择第一条记录,传递到弹出页面显示,我在这里修改其中的任何数据,DataGrid的显示数据都不会随着修改而发生变化。

然而,当我在DataGrid里选择的是第二条记录,并传递到弹出页面显示,我在这里修改的任何数据,都会同步反映到DataGrid里。

我又尝试更换这两条记录的位置,还是编辑位于第一条的记录时不能同步。

有个页面的DataGrid,只有第三条记录能同步显示,其余记录在修改时均不能同步显示。

有两个页面的DataGrid所有记录都能同步显示。

另外,即使不能同步显示,但DataGrid里记录的值其实是修改后的值。