需要确定双击来自哪个网格?

时间:2014-08-06 18:46:05

标签: wpf vb.net wpfdatagrid

我认为这应该相当简单,但我一直在查看我正在使用的处理程序的签名中的属性,并且我没有看到任何方法来找出我正在寻找的内容。< / 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,也是双击的那一行。我一直在调试模式下查看sendere对象,但是我没有看到任何地方或属性我可以检查双击来自哪个网格。

有什么想法吗?

3 个答案:

答案 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

修改:如果DataGridRowDataGrid而不是DataGrid,那么您可以使用this question查找主机{{1 }}。 (使用RelativeSourceCommandParameter似乎是可接受的方法。)

答案 2 :(得分:0)

此参数应为您提供信息:

ByVal sender As System.Object