次の機能を持つ 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 メソッドで判断し、さまざまなイベント ハンドラーにサブスクライブしないようにしたいと考えています。