取消在WPF数据网格中的行选择

3

I have

<DataGrid Name="grid" MouseDoubleClick="Attributes_MouseDoubleClick" >

每当一个单击事件在 Datagrid 行之外的其他地方发生时,我需要 取消选择一行

例如,grid.CurrentItem 应为 null

我需要仅在行上触发双击事件 。但是,问题是,一旦我选择了一行并在网格(标头、空滚动区域等)上双击,双击事件按预期触发,但 CurrentItem 有时是选定的行,有时为空。

为了防止这种行为... 我需要取消选择已选定的行。

您有什么想法应该如何解决这个问题吗?

谢谢。

2个回答

5
您可以搜索事件源的可视树以查找DataGridRow类型的实例,以确定您是否在行或其他位置上进行了双击。
以下网站包含很好的示例:检测WPF DataGrid上的双击事件。如果该网站不再提供,我已在此处包含代码。
以下是双击事件处理程序:
private void DataGridRow_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
  //search the object hierarchy for a datagrid row
  DependencyObject source = (DependencyObject)e.OriginalSource;
  var row = DataGridTextBox.Helpers.UIHelpers.TryFindParent<DataGridRow>(source);

  //the user did not click on a row
  if (row == null) return;

  //[insert great code here...]

  e.Handled = true;
}

这里是用于搜索可视树的代码:
using System.Windows;
using System.Windows.Media;

namespace DataGridTextBox.Helpers
{
  public static class UIHelpers
  {
    public static T TryFindParent<T>(this DependencyObject child) where T : DependencyObject
    {
      //get parent item
      DependencyObject parentObject = GetParentObject(child);

      //we've reached the end of the tree
      if (parentObject == null) return null;

      //check if the parent matches the type we're looking for
      T parent = parentObject as T;
      if (parent != null)
      {
        return parent;
      }
      else
      {
        //use recursion to proceed with next level
        return TryFindParent<T>(parentObject);
      }
    }

    public static DependencyObject GetParentObject(this DependencyObject child)
    {
      if (child == null) return null;

      //handle content elements separately
      ContentElement contentElement = child as ContentElement;
      if (contentElement != null)
      {
        DependencyObject parent = ContentOperations.GetParent(contentElement);
        if (parent != null) return parent;

        FrameworkContentElement fce = contentElement as FrameworkContentElement;
        return fce != null ? fce.Parent : null;
      }

      //also try searching for parent in framework elements (such as DockPanel, etc)
      FrameworkElement frameworkElement = child as FrameworkElement;
      if (frameworkElement != null)
      {
        DependencyObject parent = frameworkElement.Parent;
        if (parent != null) return parent;
      }

      //if it's not a ContentElement/FrameworkElement, rely on VisualTreeHelper
      return VisualTreeHelper.GetParent(child);
    }
  }
}

0

该事件由网格触发,而不是行触发。我的意思是,当您在网格的某个位置双击时触发,它可以是选择的行或未选择的行(或者不是您期望的行,这更糟糕)。

您可以编辑每一行的项模板,并在其中包含您的双击事件,或者capture鼠标的坐标,但这有点棘手。

希望能帮到您!


2
捕捉坐标?……认真的吗? - Robin Maben
我很抱歉,我是认真的。http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/c28355ce-23d4-4025-b19d-d7771228af63 - Morvader
这个方法怎么样?http://techiethings.blogspot.com/2010/05/get-wpf-datagrid-row-and-cell.html - Robin Maben
抱歉,我同意这是很有可能的,但对我来说并不可行,无论如何还是谢谢。 - Robin Maben

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接