Dans un gestionnaire d'événements pour une commande pour un DataGrid, j'obtiens DataGridCell dans ExecutedRoutedEventArgs. Cependant, je ne pouvais pas comprendre comment obtenir son DataGrid et DataGridRow associés. Votre aide est tres apprecie.Comment trouver son propriétaire DataGrid et DataGridRow à partir de DataGridCell dans WPF?
14
A
Répondre
12
Vous avez probablement voulez pour définir une sorte de RelativeSource
de liaison qui peut vous obtenir la « grille parent/ligne » via un {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}
, mais votre question me fait penser ...
Vous pouvez:
utiliser la réflexion:
var gridCell = ....;
var parentRow = gridCell
.GetType()
.GetProperty("RowOwner",
BindingFlags.NonPublic | BindingFlags.Instance)
.GetValue(null) as DataGridRow;
Utilisez le VisualTreeHelper
:
var gridCell = ...;
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
parent = VisualTreeHelper.GetParent(parent);
}
0
Une façon que vous pouvez faire est de passer un ou les deux des éléments nécessaires comme CommandParameter:
<MouseBinding
MouseAction="LeftDoubleClick"
Command="cmd:CustomCommands.Open"
CommandParameter="{Binding ElementName=MyDataGrid}}" />
Si vous avez besoin à la fois, vous pouvez ajouter un convertisseur de valeurs multiples qui les combine en un Tuple
(ou le laisser comme un objet [])
Puis, vous pouvez y accéder à votre code-behind en utilisant e.Parameter
2
Voici ce que je pense est une réponse complète ...
private void Copy(object sender, ExecutedRoutedEventArgs e)
{
DataGrid grid = GetParent<DataGrid>(e.OriginalSource as DependencyObject);
DataGridRow row = GetParent<DataGridRow>(e.OriginalSource as DependencyObject);
}
private T GetParent<T>(DependencyObject d) where T:class
{
while (d != null && !(d is T))
{
d = VisualTreeHelper.GetParent(d);
}
return d as T;
}