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