如何在WPF中从DataGridCell中找到它的所有者DataGrid和DataGridRow?

时间:2010-10-06 03:26:19

标签: wpf datagrid relationship

在DataGrid的Command的事件处理程序中,我在ExecutedRoutedEventArgs中获取DataGridCell。但是,我无法弄清楚如何获取其关联的DataGrid和DataGridRow。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:14)

您可能希望设置某种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);
}

答案 1 :(得分:2)

以下是我认为完整的答案......

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

答案 2 :(得分:0)

您可以做的一种方法是将一个或两个所需元素作为CommandParameter传递:

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

如果你需要两者,你可以添加一个多值转换器,将它们组合成Tuple(或将其保留为对象[])

然后在您的代码隐藏中,您可以使用e.Parameter

来访问它