WPF AutoCompleteBox в вопросах навигации клавиатуры DataGridTemplateColumn - PullRequest
1 голос
/ 19 октября 2011

Я использую AutoCompleteBox из WPF Toolkit внутри шаблона редактирования DataGridTemplateColumn в WPF4.По большей части это работает достаточно хорошо, как только я разобрался со всеми проблемами связывания с привязкой DataGrid, а также с собственными ошибками и неполнотой AutoCompleteBox.Все идет нормально.Проблема заключается в навигации по клавиатуре.

Это сценарий: существует DataGrid с двумя столбцами.Первый - это 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>

1 Ответ

2 голосов
/ 08 декабря 2011

Для перемещения фокуса на следующий столбец я создал расширенный класс (у меня отлично работает вкладка):

public class ExAutoCompleteBox : AutoCompleteBox
{
        public ExAutoCompleteBox()
        {
            PreviewKeyUp += (o, e) =>
            {
                if (e.Key == Key.Enter)
                {
                    ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            };
        }
}
...