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 № 1private 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;
}
}