Как установить фокус на WPF DataGrid или его первой строке? - PullRequest
1 голос
/ 27 сентября 2011

У меня есть WPF DataGrid, размещенный на Window. У меня есть кнопка, которая выполняет некоторую бизнес-логику и заполняет сетку.

Я хочу установить фокус на DataGrid (желательно первую строку в DataGrid), когда i TAB от кнопки. Я установил TabIndex, но почему-то фокус не приходит на DataGrid.

Соответствующая часть XAML формы находится здесь:

<StackPanel Orientation="Vertical" Grid.Column="2" Margin="20,10,10,10">
    <Button Content="Search"
                Height="25" HorizontalAlignment="Right" Margin="0,-25,0,0"
                Name="btnSearch" VerticalAlignment="Top" Width="75" **TabIndex="1300"** Click="btnSearch_Click" Keyboard.KeyDown="btnSearch_PreviewKeyDown" LostFocus="btnSearch_LostFocus"/>
</StackPanel>
<DataGrid AutoGenerateColumns="False" Grid.Column="1" Margin="20,160,10,10" Name="dataGridOrganisations" **TabIndex="1400"**
          BorderThickness="2" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" Focusable="True"
                ScrollViewer.VerticalScrollBarVisibility="Auto" ScrollViewer.HorizontalScrollBarVisibility="Auto" GridLinesVisibility="None"
           ItemsSource="{Binding}" CanUserReorderColumns="False" CanUserResizeRows="False" IsReadOnly="True" SelectionChanged="dataGridOrganisations_SelectionChanged" Keyboard.PreviewKeyDown="dataGridOrganisations_PreviewKeyDown"  >
    <DataGrid.Columns>
        <DataGridTextColumn Header="Shortname" Width="100" Binding="{Binding ShortName}" />
        <DataGridTextColumn Header="Internal Code" Width="100" Binding="{Binding LocalID}"/>
        <DataGridTextColumn Header="Name" Width="*" Binding="{Binding Name}"/>
    </DataGrid.Columns>
</DataGrid>

Когда я добавил следующий код для события LostFocus Баттона, он выделяет первую строку. Но когда я использую клавишу со стрелкой «вниз», чтобы выбрать следующую строку в сетке; вместо перехода к следующему ряду сначала устанавливается фокус на кнопке «Поиск», а в следующий раз - ко второму ряду!

if (this.dataGridOrganisations != null && this.dataGridOrganisations.HasItems)
{
    this.dataGridOrganisations.Focus();
    if (dataGridOrganisations.Items != null && dataGridOrganisations.Items.Count > 0)
    {
        DataGridRow firstRow = this.dataGridOrganisations.ItemContainerGenerator.ContainerFromItem(dataGridOrganisations.Items[0]) as DataGridRow;
        if (firstRow != null)
        {
            firstRow.IsSelected = true;
        }
    }
}

Как установить фокус на DataGrid (или его первой строке)? Почему TabIndex не работает здесь?

Ответы [ 2 ]

2 голосов
/ 27 сентября 2011

Вам даже не нужен индекс табуляции, если между иерархиями Button и DataGrid в иерархии элементов управления нет фокусируемых элементов управления.У вас довольно много обработчиков, и все кажется мне немного запутанным.Я не могу ничего найти в этом коде (может, кто-то другой, конечно, может), я бы предложил, чтобы вы попытались упростить свой код, пока он не заработает снова, как должно по умолчанию.например, табуляция этого кода должна работать:

  <StackPanel>
    <Button Content="Lorem Ipsum"/>
    <DataGrid ItemsSource="{Binding Source={StaticResource Items}}">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}"/>
        </DataGrid.Columns>
    </DataGrid>
  </StackPanel>

Кроме того, почему большая дельта индекса табуляции?Если вы должны были использовать 1301 и 1302, между ними не могло бы быть никакого значения, поэтому код должен автоматически стать более безопасным.

1 голос
/ 13 ноября 2015

Добавьте следующий код в сетку данных xaml

SelectedIndex="0" Loaded="DataGrid_Loaded"

добавить приведенный ниже код в файл .cs

private void DataGrid_Loaded(object sender, RoutedEventArgs e)

    {
        DataGrid dataGrid = sender as DataGrid;
        dataGrid.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...