在DataGrid的Command的事件处理程序中,我在ExecutedRoutedEventArgs中获取DataGridCell。但是,我无法弄清楚如何获取其关联的DataGrid和DataGridRow。非常感谢您的帮助。
答案 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