Использование ICommand и InputBindings последовательно в DataGrid - PullRequest
2 голосов
/ 20 декабря 2011

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

1 Ответ

1 голос
/ 20 декабря 2011

Обычно я присоединяю команду к DataGridCell, используя Style

Вот пример использования пользовательского AttachedCommandBehavior

<Style TargetType="{x:Type DataGridCell}">
    <Setter Property="my:CommandBehavior.Command" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyView}}, Path=DataContext.ShowPopupCommand}" />
    <Setter Property="my:CommandBehavior.CommandParameter" Value="{Binding RelativeSource={RelativeSource AncestorType={x:Type DataGridRow}}, Path=DataContext}" />
    <Setter Property="my:CommandBehavior.Event" Value="MouseDoubleClick" />
</Style>

Я не могу вспомнить, почему я прикрепил его к ячейке вместо ряда, но я уверен, что была причина. Вместо этого вы можете попробовать прикрепить событие к строке и посмотреть, что произойдет.

...