我可以在编辑模式下获取WPF数据网格的光标按键事件吗



我创建了一个WPF应用程序,其中包括一个带有一个可编辑列的数据网格。当用户在其中输入值,然后按Return时,焦点移动到下一行。一切都很好。

客户要求我添加对向上和向下光标键的支持,这样当网格中的单元格处于编辑模式时,按下会得到与按下Return相同的结果。向上按类似于返回,只是所选行将变为编辑单元格上方的行,而不是下方的行。

我在单元格上寻找了按键事件——没有乐趣——我在数据网格本身上捕捉到了keydown事件,但当我按下光标键时,它没有触发。

有人能提出解决方案吗?

编辑

应该提到的是,我使用的是MVVM风格的上下文,并绑定到ICollectionView中的一组过滤后的数据。

使用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;
    }
}

它应该起作用。

我给LPL+1作为他的答案,尽管这对我来说不起作用,因为(我认为)使用了绑定的数据上下文。然而,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;
            }
        }

最新更新