Установить фокус на TextBox при навигации по клавиатуре KeyDown (SilverLight DataGrid GetCell Content)

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

В 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, но все же установить фокус на текстовое поле при навигации по клавишам.


person Rohit    schedule 14.11.2011    source источник


Ответы (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 && child is T)
            {
                return (T)child;
            }
            else
            {
                var result = FindFirstElementInVisualTree<T>(child);
                if (result != null)
                    return result;

            }
        }
        return null;
    }
}`
person Inga    schedule 16.11.2011