Задаване на фокус върху 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