Как найти его владельца DataGrid и DataGridRow из DataGridCell в WPF? - PullRequest
15 голосов
/ 06 октября 2010

В обработчике события для команды для DataGrid я получаю DataGridCell в ExecutedRoutedEventArgs.Однако я не мог понять, как получить связанные с ними DataGrid и DataGridRow.Ваша помощь очень ценится.

Ответы [ 3 ]

14 голосов
/ 15 ноября 2012

Вы, вероятно, хотите, чтобы установил какую-то привязку RelativeSource, которая может получить "родительскую сетку / строку" через {RelativeSource FindAncestor, AncestorType={x:Type DataGrid}}, но ваш вопрос заставил меня задуматься ...

Вы можете:

Использовать отражение:

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

Использовать VisualTreeHelper:

var gridCell = ...;
var parent = VisualTreeHelper.GetParent(gridCell);
while(parent != null && parent.GetType() != typeof(DataGridRow))
{
    parent = VisualTreeHelper.GetParent(parent);
}
2 голосов
/ 10 февраля 2017

Вот что я думаю, полный ответ ...

    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;
    }
0 голосов
/ 12 декабря 2012

Один из способов сделать это - передать один или оба необходимых элемента в качестве CommandParameter:

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

Если вам нужны оба, вы можете добавить многозначный преобразователь, который объединит их в Tuple (или оставить его как объект [])

Тогда в вашем коде вы можете получить к нему доступ, используя e.Parameter

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...