我正在尝试创建一个数据网格,一旦编辑了单元格,按下Enter键,光标就会移动到下一行的同一列,并立即进入编辑模式。
我需要这个问题中的确切行为:Wpf数据网格输入键移动下一行
然而,给定的解决方案不起作用,我必须再次按下回车键才能进入编辑模式。要编辑的单元格在名为"的列中;MeasuredResult";
xaml:
<DataGrid.Columns>
<DataGridTemplateColumn Header="Aliquot ID" Width="Auto" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding AliquotId}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn x:Name="MeasuredResult" Header="MeasuredResult" Width="Auto" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox Text="{Binding MeasuredResult, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" IsReadOnly="{Binding IsReadOnlyMeasuredResult}"
BorderThickness="0" VerticalContentAlignment="Center" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" HorizontalContentAlignment="Right"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTemplateColumn Header="Unit" Width="Auto" IsReadOnly="True">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<Label Content="{Binding Unit}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
代码背后:
private void DataGrid_PreviewKeyDown(object sender, KeyEventArgs e)
{
System.Diagnostics.Debug.WriteLine("key down handler entered, key pressed = " + e.Key);
if ((e.Key == Key.Enter) || (e.Key == Key.Return))
{
DataGrid grid = sender as DataGrid;
var focusedElement = Keyboard.FocusedElement as UIElement;
focusedElement.MoveFocus(new TraversalRequest(FocusNavigationDirection.Down));
grid.SelectedItem = grid.CurrentItem;
grid.CurrentCell = new DataGridCellInfo(grid.CurrentItem, grid.Columns[4]);
grid.BeginEdit();
e.Handled = true;
}
}
我试着先使用将焦点设置在特定的单元格上
grid.CurrentCell = new DataGridCellInfo(grid.CurrentItem, grid.Columns[4]);
DataGridCell cell = (DataGridCell)grid.CurrentCell.Column.GetCellContent(grid.CurrentCell.Item).Parent;
cell.Focus();
从而完全停止进入编辑模式。我尝试将数据网格中的SelectedUnit更改为Cell,但仍然会发生同样的基本行为。非常感谢您的帮助。
我发现,如果将列从DataGridTemplateColumn
更改为到DataGridTextColumn
,即:
<DataGridTextColumn x:Name="MeasuredResult" Binding="{Binding MeasuredResult, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" Header="MeasuredResult" />
然后我得到了我想要的行为。