Могу ли я получить события нажатия клавиш курсора для таблицы данных WPF в режиме редактирования?

Я создал приложение WPF, которое включает сетку данных с одним редактируемым столбцом. Когда пользователь вводит в него значения, а затем нажимает Return, фокус перемещается на следующую строку. Все отлично работает.

Заказчик попросил меня добавить поддержку клавиш курсора вверх и вниз, чтобы, когда ячейка в сетке находится в режиме редактирования, нажатие вниз давало те же результаты, что и нажатие Return. Нажатие вверх будет похоже на Return, за исключением того, что выбранная строка станет строкой над редактируемой ячейкой, а не строкой ниже.

Я искал события нажатия клавиш в ячейке - без радости - и я зафиксировал событие нажатия клавиши в самой таблице данных, но это не сработало, когда я нажал клавишу курсора.

Может ли кто-нибудь предложить решение?

РЕДАКТИРОВАТЬ

Следует упомянуть, что я использую контекст стиля MVVM и привязываюсь к отфильтрованному набору данных в ICollectionView.


person Richard    schedule 25.07.2012    source источник


Ответы (2)


Используйте событие DataGrid.PreviewKeyDown:

<DataGrid PreviewKeyDown="DataGrid_PreviewKeyDown"

с этим обработчиком событий

private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
    DataGrid grid = sender as DataGrid;
    ICollectionView view = CollectionViewSource.GetDefaultView(grid.ItemsSource);

    switch (e.Key)
    {
        case Key.Up:
            view.MoveCurrentToPrevious();
            e.Handled = true;
            break;
        case Key.Down:
            view.MoveCurrentToNext();
            e.Handled = true;
            break;
    }
}

и он должен работать.

person LPL    schedule 25.07.2012
comment
Этого не произошло, но это может быть связано с тем, что я привязан к ICollectionView в MVVM. +1 для события PreviewKeyDown, которого я не заметил. - person Richard; 25.07.2012
comment
Это тоже нормально. Не получайте DefaultView для ItemsSource, а используйте напрямую связанный ICollectionView. - person LPL; 25.07.2012

Я поставил +1 LPL за его ответ, хотя у меня это не сработало, потому что (я думаю) из-за использования связанного контекста данных. Однако LPL указала мне правильное направление.

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

    private void OrderGrid_PreviewKeyDown(object sender, KeyEventArgs e)
    {
        var viewModel = this.DataContext as IShopOrderingViewModel;
        var view = viewModel.FilteredOrderLines as IEditableCollectionView;
        if (view.IsEditingItem)
        {
            switch (e.Key)
            {
                case Key.Up:
                    if (OrderGrid.SelectedIndex > 0)
                    {
                        OrderGrid.SelectedIndex--;
                        e.Handled = true;
                    }
                    break;
                case Key.Down:
                    if (OrderGrid.SelectedIndex < (OrderGrid.Items.Count - 1))
                    {
                        OrderGrid.SelectedIndex++;
                        e.Handled = true;
                    }
                    break;
            }
        }
person Richard    schedule 25.07.2012