专注于DataGrid中的TextBox

时间:2014-02-06 12:53:07

标签: c# wpf datagrid

我正在努力解决关注 DataGrid中存在的 TextBox 问题。 真实情况是:

我有一个DataGrid,其中我有3列.DataGrid的第3列包含2个不同的控件: - 一个是ComboBox,另一个是TextBox(两者都在同一个RowDefinition和ColumnDefinition中)。 假设我有3行所以我想要的是当我在文本框中输入文本(出现在第一行)并按ENTER然后焦点应该移动到下一行TEXTBOX,但现在发生的是它聚焦全细胞(包含ComboBox和TextBox)DataGrid。

我尝试了几个示例

 private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
        {
              var uie = e.OriginalSource as UIElement;

                if (e.Key == Key.Enter)
                {
                    e.Handled = true;
                    uie.MoveFocus(
                    new TraversalRequest(FocusNavigationDirection.Next));


                }

            }

但它将焦点转移到下一个CELL,它与使用ComoBox和TextBox的聚焦单元格相同。

我也关注了这个链接,但它有助于:

http://madprops.org/blog/enter-to-tab-as-an-attached-property/

帮帮我出来的人......聚焦控制总是BUGS ME。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案:

以下是帮助我将注意力集中在输入键上的代码:

注意: UCItems 是绑定到DataGrid的集合

private void dg_PreviewKeyDown(object sender, KeyEventArgs e)
        {

                if (e.Key == Key.Enter)
                {
                    DataGridRow rowContainer = (DataGridRow)BomPickerGrid.ItemContainerGenerator.ContainerFromItem(UCItems[gridIndex+1]);
                    if (rowContainer != null)
                    {
                        DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
                        int columnIndex = BomPickerGrid.Columns.IndexOf(BomPickerGrid.CurrentColumn);
                        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex);
                        TraversalRequest request = new TraversalRequest(FocusNavigationDirection.Last);
   /* FocusNavigationDirection.Last is used because the 
TextBox I want to focus on is the Last control in that Cell*/
                                request.Wrapped = true;
                                cell.MoveFocus(request);
                                rowContainer = (DataGridRow)BomPickerGrid.ItemContainerGenerator.ContainerFromItem(BomPickerGrid.CurrentItem);
                                BomPickerGrid.SelectedItem = BomPickerGrid.CurrentItem;
                                e.Handled = true;
                                BomPickerGrid.UpdateLayout();
                            }
                        }