Я знаю, что это действительно старый вопрос, но я публикую его здесь на случай, если он кому-нибудь поможет. Хотя принятый ответ хорош, я не верю, что он покрывает случай, когда в том же окне есть другой элемент управления, и вы хотели бы перейти на DataGrid
из этого элемента управления. Кроме того, вам может потребоваться поведение, описанное в исходном вопросе (одна вкладка, одна вкладка, нет перехода по ячейкам / столбцам). Это решение направлено на достижение этого.
Примечание: Это решение предполагает, что вы хотите, чтобы ваш SelectionUnit
был FullRow
в вашем DataGrid
.
Во-первых, вот Style
для применения к DataGrid
:
<DataGrid.Resources>
<Style TargetType="DataGridRow">
<Style.Setters>
<Setter Property="Focusable" Value="True"/>
</Style.Setters>
<Style.Triggers>
<Trigger Property="IsFocused" Value="True">
<Setter Property="IsSelected" Value="True"/>
</Trigger>
</Style.Triggers>
</Style>
<Style TargetType="DataGridCell">
<Style.Setters>
<Setter Property="Focusable" Value="False"/>
</Style.Setters>
</Style>
</DataGrid.Resources>
Этот стиль позволяет фокусироваться на строках, но не позволяет фокусироваться на отдельных ячейках, что обеспечивает фокусировку в соответствии с SelectionUnit
из FullRow
. Триггер, установленный внутри этого стиля, является необязательным - он необходим только в том случае, если вы хотите автоматически выбирать строку при получении фокуса.
В моем случае мне нужно было поведение одной вкладки / tab, поэтому я также установил свойство KeyboardNavigation.TabNavigation
для моего DataGrid
= "Once".
<DataGrid SelectionUnit="FullRow" KeyboardNavigation.TabNavigation="Once">
При таком подходе я все еще могу использовать клавиши со стрелками вверх / вниз для циклического перемещения по строкам, как только DataGrid
получает фокус, но я все еще могу быстро перемещаться, если я хочу переместить фокус на следующий элемент управления в порядке вкладок .