C# 如何从DataGridCell或模板内的文本框获取DataGrid

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"> <

我有一个DataGrid(ProductsDataGrid),这个DataGrid有一个RowDetailTemplate。此RowDetailTemplate有另一个DataGrid,第二个DataGrid在其列中有一个DataTemplate。我想从文本框的LostFocus事件中获取第二个数据网格(WarehouseDataGrid)

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