C# 如何从DataGridCell或模板内的文本框获取DataGrid
我有一个DataGrid(ProductsDataGrid),这个DataGrid有一个RowDetailTemplate。此RowDetailTemplate有另一个DataGrid,第二个DataGrid在其列中有一个DataTemplate。我想从文本框的LostFocus事件中获取第二个数据网格(WarehouseDataGrid)C# 如何从DataGridCell或模板内的文本框获取DataGrid,c#,wpf,silverlight,datagrid,C#,Wpf,Silverlight,Datagrid,我有一个DataGrid(ProductsDataGrid),这个DataGrid有一个RowDetailTemplate。此RowDetailTemplate有另一个DataGrid,第二个DataGrid在其列中有一个DataTemplate。我想从文本框的LostFocus事件中获取第二个数据网格(WarehouseDataGrid) <sdk:DataGrid x:Name="ProductsDataGrid"> <
<sdk:DataGrid x:Name="ProductsDataGrid">
<sdk:DataGrid.Columns>
<sdk:DataGridTextColumn Header="Product Name" />
<sdk:DataGridTextColumn Header="Quantity" />
<sdk:DataGridTextColumn Header="Value" />
</sdk:DataGrid.Columns>
<sdk:DataGrid.RowDetailsTemplate>
<DataTemplate>
<sdk:DataGrid x:Name="WarehouseDataGrid">
<sdk:DataGrid.Columns>
<sdk:DataGridTemplateColumn Header="Warehouse" />
<sdk:DataGridTemplateColumn Header="Quantity">
<sdk:DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBox x:Name="txtQuantity" LostFocus="txtQuantity_LostFocus" />
</DataTemplate>
</sdk:DataGridTemplateColumn.CellTemplate>
</sdk:DataGridTemplateColumn>
</sdk:DataGrid.Columns>
</sdk:DataGrid>
</DataTemplate>
</sdk:DataGrid.RowDetailsTemplate>
</sdk:DataGrid>
我想得到DataGrid(WarehouseDataGrid),但我只得到DataGridCell。我还尝试了DataGridCell.Parent,但它不是DataGrid。为什么不尝试遍历树呢?专注于穿越祖先:@SOReader成功了。我曾尝试使用一些树木助手,但我没有注意到他们是后代,在这种情况下,这是祖先。听到这一点很高兴;)谢谢你的回答。在你回答之前,我用@SOReader建议的答案解决了我的问题,这基本上就是你的答案。
private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
{
var warehouseDataGrid = ((TextBox)sender).GetAncestor<DataGrid>();
... // do stuff
}
private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
{
var warehouseDataGrid = ((TextBox)sender).GetAncestor<DataGrid>();
... // do stuff
}
public static class ControlExtensions
{
public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement )
where TAncestor : DependencyObject
{
return subElement.GetAncestor<TAncestor>( potentialAncestorToStopTheSearch: null );
}
public static TAncestor GetAncestor<TAncestor>( this DependencyObject subElement, UIElement potentialAncestorToStopTheSearch )
where TAncestor : DependencyObject
{
DependencyObject parent;
for (DependencyObject subControl = subElement; subControl != null; subControl = parent)
{
if (subControl is TAncestor) return (TAncestor) subControl;
if (object.ReferenceEquals( subControl, potentialAncestorToStopTheSearch )) return null;
parent = VisualTreeHelper.GetParent( subControl );
if (parent == null)
{
FrameworkElement element = subControl as FrameworkElement;
if (element != null)
{
parent = element.Parent;
}
}
}
return null;
}
}