Я пытаюсь создать 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, уместно ли обрабатывать команду, а не подписываться на тонны различных обработчиков событий ..