Блок автозаполнения WPF в DataGridTemplateColumn проблемы с навигацией по клавиатуре

#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, и в целом мы довольны этим, но спасибо за ответ!