WPF AutoCompleteBox в DataGridTemplateColumn Клавиатуры Проблемы навигации
-
26-10-2019 - |
Вопрос
Я использую AutoCompletebox из WPF Toolkit внутри шаблона редактирования DataGridTemplateColumn в WPF4. По большей части он работает достаточно хорошо, как только я разобрался со всеми проблемами привязки, связанных с привязкой DataGrid, а также с собственной GotChas и неполнотой AutoCOMPLETEBOX. Все идет нормально. Проблема - навигация по клавиатуре.
Это сценарий: есть данные с двумя столбцами. Первый - это DataGridTemplateColumn, который имеет AutoCompletebox в своем шаблоне редактирования. Второй - просто обычный DataGridTextColumn.
Если я вызываю редактирование строки, я могу выбрать элемент в AutoCompletebox. Я нажимаю вкладку, чтобы перейти к следующему столбцу, но вместо этого отредактирование строки станет совершенным, и фокус клавиатуры не перемещается в следующий столбец. Если бы это был DataGridTextColumn, он оставался бы в режиме редактирования и позволил бы мне редактировать следующий столбец. Это также происходит для новых рядов.
На мой взгляд, кажется, что что -то не так с тем, где WPF решает отправить фокус клавиатуры, когда она выходит из AutoCompletebox, но я не могу понять, что я могу с этим сделать, и я также не смог найти Кто -нибудь говорит об той же проблеме, которая предлагает либо я делаю что -то не так, либо никто не заботится о навигации по клавиатуре через их сетки. Я использовал подкласс TemplateColumn, который переопределяет PrepareCellForediting, чтобы убедиться, что фокус приземляется в AutoCompletebox сразу же при редактировании ячейки (как и другие ответы здесь), но проблема сохраняется, если я отключаю весь этот код, так что это не является эффектом этого бита хитрость, насколько я могу судить.
Любые идеи?
XAML выглядит более или менее таким (упрощено, конечно, сетка имеет гораздо больше двух столбцов, а некоторые довольно сложные связывания данных продолжаются - я оставил привязки и держал ее в общей структуре).
<DataGrid>
<DataGridTemplateColumn Header="AutoCompleteBox">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate><TextBlock /></DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<toolkit:AutoCompleteBox>
<!-- autocompletebox's item template etc. -->
</toolkit:AutoCompleteBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Header="Text" />
</DataGrid>
Решение
Для перемещения фокусировки к следующему столбцу, который я сделал расширенным классом (вкладка отлично работает для меня):
public class ExAutoCompleteBox : AutoCompleteBox
{
public ExAutoCompleteBox()
{
PreviewKeyUp += (o, e) =>
{
if (e.Key == Key.Enter)
{
((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
};
}
}