我认为这应该相当简单,但我一直在查看我正在使用的处理程序的签名中的属性,并且我没有看到任何方法来找出我正在寻找的内容。< / p>
我有一个相当简单的WPF应用程序,在同一个窗口中有两个DataGrid控件。我在XAML中定义了双击事件,如下所示:
<DataGrid.ItemContainerStyle>
<Style TargetType="DataGridRow">
<EventSetter
Event="MouseDoubleClick"
Handler="Row_DoubleClick"/>
</Style>
</DataGrid.ItemContainerStyle>
在后面的代码中(我们在WPF应用程序中称它为什么?)我设置Row_DoubleClick
处理程序如下:
Private Sub Row_DoubleClick(ByVal sender As System.Object, ByVal e As System.Windows.Input.MouseButtonEventArgs)
现在sub本身工作正常并且拾取双击的行就好了。但是,正如我之前提到的,我有两个DataGrids,它们使用同一个子进行双击事件。我意识到一条路径可能只是简单地制作两个子路径,但似乎我应该能够同时使用两个路径,并且它在两种情况下采用完全相同的动作,只使用一个DataGrid或另一个的行。
它始终默认为第一个,我们称之为IncompleteGrid
,如果选择了一行,即使第二个DataGrid,我们称之为CompleteGrid
,也是双击的那一行。我一直在调试模式下查看sender
和e
对象,但是我没有看到任何地方或属性我可以检查双击来自哪个网格。
有什么想法吗?
答案 0 :(得分:1)
您可以使用VisualTreeHelper从行获取父dataGrid。在您的代码上使用此私有方法(代码在C#中,希望您可以轻松地将其转换为VB):
private void Row_DoubleClick(object sender, MouseButtonEventArgs e)
{
DataGridRow row = sender as DataGridRow;
DataGrid senderDataGrid = FindAncestor<DataGrid>(row);
}
private T FindAncestor<T>(DependencyObject dependencyObject)
where T : DependencyObject
{
var parent = VisualTreeHelper.GetParent(dependencyObject);
if (parent == null) return null;
var parentT = parent as T;
return parentT ?? FindAncestor<T>(parent);
}
VB版 :
Private Sub Row_DoubleClick(sender As Object, e As MouseButtonEventArgs)
Dim row As DataGridRow = TryCast(sender, DataGridRow)
Dim senderDataGrid As DataGrid = FindAncestor(Of DataGrid)(row)
End Sub
Private Function FindAncestor(Of T As DependencyObject)(dependencyObject As DependencyObject) As T
Dim parent = VisualTreeHelper.GetParent(dependencyObject)
If parent Is Nothing Then
Return Nothing
End If
Dim parentT = TryCast(parent, T)
Return If(parentT, FindAncestor(Of T)(parent))
End Function
答案 1 :(得分:0)
sender
应该是双击来自的网格。 (这就是sender
的意思 - 发送事件的控件。)
如果你想用sender
做特定的事情,你可以将DataGrid
投射到sender
。
修改:如果DataGridRow
是DataGrid
而不是DataGrid
,那么您可以使用this question查找主机{{1 }}。 (使用RelativeSource
或CommandParameter
似乎是可接受的方法。)
答案 2 :(得分:0)
此参数应为您提供信息:
ByVal sender As System.Object