我有一个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导航时将焦点设置到文本框..
答案 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;
}
}`