WPF AutoCompleteBox в DataGridTemplateColumn Клавиатуры Проблемы навигации

StackOverflow https://stackoverflow.com/questions/7820179

  •  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));
                }
            };
        }
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top