【问题标题】:Need to determine which grid a double-click came from?需要确定双击来自哪个网格?
【发布时间】:2014-08-06 18:46:04
【问题描述】:

我认为这应该相当简单,但我一直在查看我正在使用的处理程序的签名中的属性,但我没有看到任何方法来找出我在寻找什么。

我有一个相当简单的 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 使用相同的 sub 进行双击事件。我意识到一条路径可能是简单地制作两个潜艇,但似乎我应该能够为两者使用一个,并且在任何一种情况下它都采取完全相同的操作,只需使用来自一个 DataGrid 或另一个的行。

它始终默认为第一个,我们称之为IncompleteGrid,如果选择了一行,即使第二个DataGrid,我们称之为CompleteGrid,是被双击的那个。我一直在调试模式下查看sendere 对象,但我没有看到任何可以检查双击来自哪个网格的位置或属性。

有什么想法吗?

【问题讨论】:

  • SENDER 是对被点击的网格的引用。
  • @Steve sender 显示为 System.Windows.Controls.DataGridRow 而不是 System.Windows.Controls.DataGrid,因此我无法直接从中获取 DataGrid 对象。有没有办法从行中获取托管 DataGrid 对象?

标签: wpf vb.net wpfdatagrid


【解决方案1】:

您可以使用VisualTreeHelper 从行中获取父数据网格。在你的代码上使用这个私有方法(代码是 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

【讨论】:

  • 哇,没想到会这样。很好的答案,感谢您的翻译。我想我本来可以从 C# 中整理出来,出于某种原因,我们只是在这里用 VB 编写,但这非常有帮助。完美运行!再次感谢!
【解决方案2】:

这个参数应该给你信息:

ByVal sender As System.Object

【讨论】:

  • 发件人显示为“DataGridRow”而不是“DataGrid”对象。已经看过那个了。
【解决方案3】:

sender 应该是双击来自的网格。 (这就是sender 的含义——发送事件的控件。)

如果你想用它做特定的事情,你可以将 sender 转换为 DataGrid

编辑:如果senderDataGridRow 而不是DataGrid,那么您可以使用this question 来查找主机DataGrid。 (使用 RelativeSourceCommandParameter 似乎是公认的方法。)

【讨论】:

  • Sender 显示为“DataGridRow”而不是“DataGrid”对象,所以没有骰子 - 除非有一种方法可以从“DataGridRow”对象获取主机数据网格。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多