2011-11-14 10 views
1

Silverlightアプリケーションがあり、その中にdataGridがあり、DataBoxの各行にTextBoxを追加しました。ここで達成しようとしているのは、ユーザーがダウンキーを押すと、選択された行が変更されます。ユーザーがデータを入力できるように、TextBoxにフォーカスを設定する必要があります。 XAMLに、そのようなキーボードナビゲーションでKeyBoxにフォーカスを設定KeyDown(SilverLight DataGrid GetCell Content)

追加テキストボックス:

<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(); 
} 

PS私はDataGridの行選択を無効にすることができますが、キーダウンナビゲーション時にテキストボックスにフォーカスを設定します。

答えて

1

データテンプレート内の項目にアクセスするには汎用VisualThruperメソッドを使用する

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; 
    } 
}` 
関連する問題