0

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

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

我已经在单元格上寻找按键事件 - 不高兴 - 我已经在数据网格本身上捕获了 keydown 事件,但是当我按下光标键时这并没有触发。

任何人都可以提出解决方案吗?

编辑

应该提到,我正在使用 MVVM 样式上下文并绑定到 ICollectionView 中的一组过滤数据。

4

2 回答 2

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

它应该可以工作。

于 2012-07-25T08:41:00.460 回答
0

我为 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;
            }
        }
于 2012-07-25T14:35:01.777 回答