2010-10-06 23 views

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