#wpf #datagrid #autocompletebox
#wpf #datagrid #поле автозаполнения
Вопрос:
Я использую AutoCompleteBox из инструментария WPF внутри шаблона редактирования DataGridTemplateColumn в WPF4. По большей части это работает достаточно хорошо, как только я разобрался со всеми проблемами привязки к привязке DataGrid, а также с собственными ошибками и незавершенностью AutoCompleteBox. Пока все хорошо. Проблема заключается в навигации по клавиатуре.
Это сценарий: есть DataGrid с двумя столбцами. Первый — это DataGridTemplateColumn, в шаблоне редактирования которого есть поле автозаполнения. Второй — просто обычный DataGridTextColumn.
Если я вызываю редактирование строки, я могу выбрать элемент в поле автозаполнения. Я нажимаю tab, чтобы перейти к следующему столбцу, но вместо этого редактирование строки фиксируется, и фокус клавиатуры не перемещается к следующему столбцу. Если бы это был DataGridTextColumn, он оставался бы в режиме редактирования и позволял мне редактировать следующий столбец. Это также происходит для новых строк.
На мой взгляд, кажется, что что-то не так с тем, где WPF решает отправить фокус клавиатуры, когда он выходит из автозаполнения, но я не могу понять, что я могу с этим поделать, и я также не смог найти никого, кто говорил бы о той же проблеме, что предполагает, что я либоя делаю что-то не так, или никто больше не заботится о навигации по клавиатуре в своих сетках. Я использую подкласс TemplateColumn TemplateColumn, который переопределяет PrepareCellForEditing, чтобы гарантировать, что фокус попадает в поле автозаполнения сразу после редактирования ячейки (согласно другим ответам здесь), но проблема сохраняется, если я отключу весь этот код, так что, насколько я могу судить, это не эффект этой хитрости.
Есть идеи?
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>
Ответ №1:
Для перемещения фокуса на следующий столбец я создал расширенный класс (вкладка отлично работает для меня):
public class ExAutoCompleteBox : AutoCompleteBox
{
public ExAutoCompleteBox()
{
PreviewKeyUp = (o, e) =>
{
if (e.Key == Key.Enter)
{
((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
}
};
}
}
Комментарии:
1. Это именно то, о чем я должен был подумать в то время, спасибо. Как оказалось, вместо этого мы использовали ItemsControl и ListBox с различными сложными ItemTemplates, и в целом мы довольны этим, но спасибо за ответ!