2016-11-16 3 views
0

最初の列セルがテキストボックスにバインドされるデータグリッドがあります。バインドされたテキストボックスにフォーカスがあるときに、データグリッドの行全体の内容を取得したいと思います。 GotFocusでイベントをトリガーすることはできますが、DataGridで何も選択されていないため、現在のところどの行が「編集中」であるのかわかりません。何か案は?DatagridTemplateColumn.CellTemplateがTextBoxの場合、DataGrid行を取得する方法

<DataGrid x:Name="buildDataGrid" 
      ItemsSource="{Binding BuildData}" 
      AutoGenerateColumns="False" 
      CanUserReorderColumns="False" 
      CanUserSortColumns="False" 
      CanUserResizeRows="False" 
      SelectionUnit="CellOrRowHeader" 
      CanUserAddRows="False" 
      CanUserDeleteRows="False" 
      Margin="0,0,10,0"> 
    <DataGrid.Columns> 
     <DataGridTemplateColumn Header="Serial Number" 
           MinWidth="200" 
           Width="*" 
           x:Name="componentSerialNumberDataGridTemplate"> 
      <DataGridTemplateColumn.CellTemplate> 
       <DataTemplate> 
        <TextBox Text="{Binding SerialNumber, UpdateSourceTrigger=PropertyChanged}" 
          x:Name="snoTextBox" 
          BorderThickness="0" 
          Focusable="True" 
          GotFocus="snoTextBox_GotFocus"> 
         <TextBox.InputBindings> 
          <KeyBinding Command="{Binding SerialNumberEnterCommand}" 
             CommandParameter="{Binding Path=Text, ElementName=snoTextBox}" 
             Key="Return"/> 
         </TextBox.InputBindings> 
        </TextBox> 
       </DataTemplate> 
      </DataGridTemplateColumn.CellTemplate> 
     </DataGridTemplateColumn> 

     <DataGridTextColumn Header="Part Number" 
          Binding="{Binding ComponentNumber}" 
          CanUserReorder="False" 
          MinWidth="200" 
          IsReadOnly="True" 
          CanUserResize="True" /> 
     <DataGridTextColumn Header="Description" 
          Binding="{Binding ComponentName}" 
          CanUserReorder="False" 
          Width="Auto" 
          MinWidth="400" 
          IsReadOnly="True" 
          CanUserResize="True" /> 
    </DataGrid.Columns> 
</DataGrid> 
+1

これを試しましたか? http://blog.scottlogic.com/2008/12/02/wpf-datagrid-detecting-clicked-cell-and-row.html –

+1

ありがとうございました。うまくいきました。ソリューションを投稿しました。 – Steven

答えて

0

Devlin Carnateのおかげで、私は正しい方向を指摘して解決策を見つけました!

private void snoTextBox_GotFocus(object sender, RoutedEventArgs e) 
     { 
      DependencyObject dep = (DependencyObject)e.OriginalSource; 

      // iteratively traverse the visual tree 
      while ((dep != null) && !(dep is DataGridCell) && !(dep is System.Windows.Controls.Primitives.DataGridColumnHeader)) 
      { 
       dep = VisualTreeHelper.GetParent(dep); 
      } 

      if (dep == null) 
       return; 

      if (dep is DataGridCell) 
      { 
       DataGridCell cell = dep as DataGridCell; 
       // navigate further up the tree 
       while ((dep != null) && !(dep is DataGridRow)) 
       { 
        dep = VisualTreeHelper.GetParent(dep); 
       } 

       DataGridRow row = dep as DataGridRow; 
       if (row != null) 
       { 
        ComponentData cd = row.DataContext as ComponentData; 
        statusMessage(cd.ComponentNumber); 
       } 
      } 
     } 
関連する問題