Установите фокус на текстовое поле, нажав клавишу навигации с клавиатуры (SilverLight DataGrid получает содержимое ячейки)

#silverlight #datagrid

#silverlight #datagrid

Вопрос:

У меня есть приложение Silverlight с сеткой данных в нем, я добавил текстовое поле в каждую строку сетки данных, в шестой столбец, теперь то, чего я пытаюсь достичь здесь, как только пользователь нажимает клавишу down, выбранная строка изменяется, как только это происходит, фокус должен быть установлен на текстовое поле, чтобы пользователь мог вводить данные.

Добавлено текстовое поле в xaml, вот так:

 <sdk:DataGridTemplateColumn Header="Confirmation code" Width="Auto">
    <sdk:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <TextBox/>
        </DataTemplate>
    </sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
  

И добавил это в xaml.cs при событии DataGrid_SelectionChanged:

 private void BookingsView_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
TextBox content = DataGrid.Columns[6].GetCellContent(DataGrid.SelectedItem) as TextBox;
if (content != null) 
  content.Focus();
}
  

P.S : дополнительно, если возможно, пожалуйста, предложите мне способ, с помощью которого я могу отключить выбор строк в DataGrid, но при этом установить фокус на текстовое поле при нажатии клавиши навигации..

Ответ №1:

Для доступа к элементам внутри шаблона данных вы можете использовать общий метод VisualTreeHelper

 private void DataGrid_SelectionChanged(object sender, System.Windows.Controls.SelectionChangedEventArgs e)
    {
        var grid = sender as DataGrid;
        var cell = grid.Columns[6].GetCellContent(grid.SelectedItem).Parent as DataGridCell ;

        var textbox = FindFirstElementInVisualTree<TextBox>(cell);

               if(textbox !=null)
                   {
                      textbox.Focus();
                   }


    }

    private T FindFirstElementInVisualTree<T>(DependencyObject parentElement) where T : DependencyObject
    {
        var count = VisualTreeHelper.GetChildrenCount(parentElement);
        if (count == 0)
            return null;

        for (int i = 0; i < count; i  )
        {
            var child = VisualTreeHelper.GetChild(parentElement, i);

            if (child != null amp;amp; child is T)
            {
                return (T)child;
            }
            else
            {
                var result = FindFirstElementInVisualTree<T>(child);
                if (result != null)
                    return resu<

            }
        }
        return null;
    }
}`