2010-10-06 13 views

Respuesta

12

Probablemente quiere establecer algún tipo de RelativeSource unión que se puede obtener la "red de padres/fila" a través de un {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, pero tu pregunta me hizo pensar ...

Usted podría:

uso Reflexión:

var gridCell = ....; 
var parentRow = gridCell 
     .GetType() 
     .GetProperty("RowOwner", 
       BindingFlags.NonPublic | BindingFlags.Instance) 
     .GetValue(null) as DataGridRow; 

Utilice la VisualTreeHelper:

var gridCell = ...; 
var parent = VisualTreeHelper.GetParent(gridCell); 
while(parent != null && parent.GetType() != typeof(DataGridRow)) 
{ 
    parent = VisualTreeHelper.GetParent(parent); 
} 
0

Una forma que podría hacer es pasando uno o ambos de los elementos necesarios como CommandParameter:

<MouseBinding 
    MouseAction="LeftDoubleClick" 
    Command="cmd:CustomCommands.Open" 
    CommandParameter="{Binding ElementName=MyDataGrid}}" /> 

Si necesita tanto, se podría añadir un convertidor de valores múltiples que las combina en una Tuple (o dejarlo como un objeto [])

Luego, en el código subyacente puede acceder a él mediante el uso de e.Parameter

2

Esto es lo que creo que es una respuesta completa ...

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