/ / Comment obtenir DataGrid à partir de DataGridCell ou de TextBox dans un modèle - c #, wpf, silverlight, datagrid

Comment obtenir DataGrid à partir de DataGridCell ou de TextBox dans un modèle - c #, wpf, silverlight, datagrid

J'ai un DataGrid (ProductsDataGrid) et celaDataGrid a un RowDetailTemplate. Ce RowDetailTemplate a un autre DataGrid et ce deuxième DataGrid a un DataTemplate dans une de ses colonnes. Je souhaite obtenir ce deuxième DataGrid (WarehouseDataGrid) à partir d'un événement LostFocus d'une zone de texte.

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

j'ai essayé

 private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
{
TextBox txt = sender as TextBox;
var a = txt.Parent; // returns DataGridCell
}

Je veux obtenir le DataGrid (WarehouseDataGrid) mais je viens juste d'obtenir DataGridCell. Aussi, j'ai essayé DataGridCell.Parent mais ce n'est pas DataGrid.

Réponses:

2 pour la réponse № 1
private void txtQuantity_LostFocus(object sender, RoutedEventArgs e)
{
var warehouseDataGrid = ((TextBox)sender).GetAncestor<DataGrid>();
... // do stuff
}

GetAncestor est une méthode d'extension

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