Как заставить клавиатуру сосредоточиться на DataGrid? - PullRequest
1 голос
/ 27 августа 2011

СТАРЫЙ НАЗВАНИЕ: Несогласованные действия в GridView SelectCell + Focus / Edit (GridView Reloaded дважды)

Я разрабатываю набор GridView (связанный данными) в свойстве Content модуля Expander.Когда я открываю Расширитель, я хочу, чтобы третий столбец, первый элемент был выбран и редактировался (но просто сфокусированный также был бы приемлем).Когда я попытался добавить эту функциональность к этому действию, прикрепленному к Расширенному, сетка никогда не выбирала первый элемент для меня.Я сделал некоторые проблемы, и, как ни странно, я заметил, что что-то происходит.Расширитель является частью шаблона в ItemsCollection, поэтому каждый раз, когда я добавляю новый элемент в это ItemsCollection, на экране создается Expander (по умолчанию IsExpanded = false).Я установил для Debug.WriteLine событие Expander_Expanded, а также событие DataGrid.Loaded, чтобы сообщить мне, когда происходили события.Вот код для обоих этих событий.

DataGrid.Loaded:

DataGrid dg = sender as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();

Expander.Expanded:

Expander expander = sender as Expander;
DataGrid dg = expander.Content as DataGrid;
dg.Focus();
dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
dg.BeginEdit();

Когда я создаю элемент, который содержит Expanderи это показано на экране, происходит событие DataGrid.Loaded.Когда расширитель раскрывается впервые, возникает событие Expander.Expanded, а также DataGrid.Loaded.Каждый раз после этого срабатывает только событие Expander.Expanded.

В первый раз ячейка в [0] [2] фокусируется и находится в режиме редактирования.Каждый второй раз ячейки не выделяются / не фокусируются.Если в событии DataGrid.Loaded отсутствует код, ячейка не будет находиться в фокусе или в режиме редактирования, независимо от того, открывается ли Expander впервые или нет.Expander.Expanded, похоже, на самом деле ничего не делает, в плане выбора.Для записи, привязки для DataGrid работают отлично, и независимо от того, когда я делаю изменения (независимо от того, открывается ли Expander в первый раз или через какое-то время впоследствии), данные обновляются правильно.Кто-нибудь может объяснить это?

ОБНОВЛЕНИЕ:

После дальнейшего исследования, оно не имеет ничего общего с событием GridLoaded, как с Keyboard.Focus.При первой загрузке DataGrid фокус клавиатуры направляется в ячейку (в виде текстового поля), о которой я ее прошу.Однако каждый раз после этого фокус клавиатуры все еще находится на кнопке ToggleButton, которая открывает сам расширитель.Попытка установить Keyboard.Focus (dgCell) или Keyboard.Focus (dg), похоже, ничего не делает, даже если они оба фокусируемые.Мне удалось проверить это предположение, нажав кнопку «Ввод» при открытии DataGrid.Если DataGrid имеет фокус клавиатуры, ввод переместится на следующую строку.Если ToggleButton имеет фокус, он свернет Expander.

Как отмечалось ранее, при первом открытии Expander DataGrid фокусируется на клавиатуре, но каждый раз фокус всегда заканчивается кнопкой.Есть предложения?

1 Ответ

3 голосов
/ 31 августа 2011

Я решил это, вызвав более позднее событие. Использование Expander вызвало переключение Keyboard.Focus на кнопку, которая включает экспандер после того, как произойдет операция Expanded (что свело на нет мою работу по переключению фокуса) Поэтому я использовал Expander_SizeChanged и добавил проверку, чтобы убедиться, что событие было вызвано открытием Expander, а не изменением самого окна. Установив фокус здесь и выбрав ячейку, которую я хотел отработать.

Вот код, который заставил его работать (expandSomething - логическое значение, запущенное в прослушивателе событий Expander_Expanded).

Expander expander = sender as Expander;
if (expander.IsExpanded && expandSomething)
{
    expandSomething = false;
    DataGrid dg = expander.Content as DataGrid;
    dg.Focus();
    if (dg.SelectedCells.Count == 0)
    {
        dg.CurrentCell = new DataGridCellInfo(dg.Items[0], dg.Columns[2]);
        dg.SelectedCells.Add(dg.CurrentCell);
    }
    else
    {
        dg.CurrentCell = dg.SelectedCells[0];
    }
}    
...