Фокус проблема с Wpf DataGrid - PullRequest
       39

Фокус проблема с Wpf DataGrid

0 голосов
/ 20 октября 2011

Я использую WPFToolKit DataGrid для отображения данных;В моем случае

  1. пользователь нажимает на ячейку и вводит значение (я перехватываю событие и устанавливаю фокус на TextBox)
  2. . Нажмите Enter
  3. Фокус смещается на следующую ячейку

Теперь пользователь не может ввести любое значение в TextBoxDataGridCell), если он не нажмет наклетка.TextBox может быть частью различных элементов управления (например, NumericUpDown, Calendar и т. Д.).

Это поведение аналогично Excel, но я не могу переместить фокус на базовый TextBox поскольку в DataGridCell есть различные другие пользовательские элементы управления оболочки (что-то вроде DataGridCell содержит MatrixCellContainer, который содержит MatrixCell, который содержит UpDown элемент управления)

Любой указатель будет действительно полезен.

Обновление:

Я могу достичь того, что ищу, обработав событие DataGridCell_Selected, например:

private void DataGridCell_Selected(object sender, RoutedEventArgs e)
{
        Microsoft.Windows.Controls.DataGridCell dataGridCell = 
               sender as Microsoft.Windows.Controls.DataGridCell;

    // ToDo: This is a very bad hack; 
    // should be replaced by some proper technique
    if (dataGridCell != null)
    {
        NumericUpDownBase<int>[] IntUpDownControls = 
            dataGridCell.GetChildrenOfType<NumericUpDownBase<int>>();
        if (IntUpDownControls.Count() != 0)
        {
            IntUpDownControls[0].Focus();
            //Keyboard.Focus(IntUpDownControls[0]);
        }
    else
    {
        NumericUpDownBase<double>[] DblUpDownControls = 
                dataGridCell.GetChildrenOfType<NumericUpDownBase<Double>>();
         if (DblUpDownControls.Count() != 0)
         {
                 DblUpDownControls[0].Focus();
                 //Keyboard.Focus(DblUpDownControls[0]);
          }
    }
    }
 }

Но я знаю, что будет лучший способчтобы достичь этого!

Ответы [ 2 ]

2 голосов
/ 20 октября 2011

Как вы устанавливаете фокус на следующую ячейку?

WPF имеет две версии фокусировки: логическая фокусировка и фокусировка клавиатуры. Я подозреваю, что вы используете myDataGridCell.Focus(), который только устанавливает логический фокус.

myDataGridCell.Focus();         // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus
0 голосов
/ 19 января 2012

Наконец-то я с этим согласился -

private void HandleCellSelected(object sender, RoutedEventArgs e)
{
    DataGridCell dataGridCell = sender as DataGridCell;
    if (dataGridCell != null)
    {
        TextBox[] textboxcontrols = dataGridCell.GetChildrenOfType<TextBox>();
        if (textboxcontrols.Count() != 0)
        {
            textboxcontrols[0].Focus();
        }
    }
}

Тем не менее, все еще ищем лучший подход ...

...