我正在尝试创建一个具有以下功能的 DataGrid:
- 只读数据网格,但通过双击和单独的编辑表单提供编辑功能(双击特定行)
- 调用新/编辑/删除表单的 ContextMenu(右键单击整个 DataGrid)
- 调用删除表单的删除键(在特定选定行上)
我认为使用 ICommand 是个好主意,所以我创建了一个这样的 DataGrid:
public class MyDataGrid : DataGrid {
public static readonly RoutedCommand NewEntry = new RoutedCommand();
public static readonly RoutedCommand EditEntry = new RoutedCommand();
public static readonly RoutedCommand DeleteEntry = new RoutedCommand();
public MyDataGrid() {
CommandBindings.Add(new CommandBinding(NewEntry, ..., ...));
CommandBindings.Add(new CommandBinding(EditEntry, ..., ...));
CommandBindings.Add(new CommandBinding(DeleteEntry, ..., ...));
InputBindings.Add(new InputBinding(DeleteCommand, new KeyGesture(Key.Delete)));
InputBindings.Add(new MouseBinding(EditEntry, new MouseGesture(MouseAction.LeftDoubleClick)));
// ContextMenu..working fine
}
}
然后我意识到,双击一行不起作用,所以我添加了这个:
LoadingRow += (s, e) =>
e.Row.InputBindings.Add(new MouseBinding(EditEntry,
new MouseGesture(MouseAction.LeftDoubleClick)));
当然删除键也不起作用,我添加了这个:
PreviewKeyDown += (s, e) => { if(e.Key == Key.Delete) { ... } };
为什么我必须这样做?使用命令来防止这种对事件的攻击难道不是重点吗?我错过了什么吗?
在我简单而完美的世界中,我想在 CanExecute 方法中决定是否适合处理命令,而不是订阅大量不同的事件处理程序。