当DatagridTemplateColumn.CellTemplate是TextBox时,如何获取datagrid行

时间:2016-11-16 15:29:33

标签: c# wpf datagrid

我有一个数据网格,其中第一列单元格绑定到文本框。当绑定文本框具有焦点时,我想获取数据网格的整行内容。我可以使用GotFocus触发事件,但由于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 个答案:

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