将焦点放在TextBox上,键盘导航KeyDown(SilverLight DataGrid GetCell Content)

时间:2011-11-14 06:33:04

标签: silverlight datagrid

我有一个Silverlight应用程序,里面有一个dataGrid,我在第六列的DataGrid的每一行添加了一个TextBox,现在我想在这里完成的是,一旦用户按下向下键,所选行会更改,一旦焦点应该设置为TextBox,以便用户可以输入数据。

为xaml添加了文本框,如下所示:

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

并将其添加到DataGrid_SelectionChanged事件下的xaml.cs中:

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的行选择,但仍然可以在keydown导航时将焦点设置到文本框..

1 个答案:

答案 0 :(得分: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;
    }
}`