我创建了一个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;
}
}