отменить выбор строки в wpf datagrid

у меня есть

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

Мне нужно снять выделение строки всякий раз, когда событие щелчка происходит где-либо еще, кроме строки Datagrid.

т.е. grid.CurrentItem должно быть null

Мне нужно запустить событие двойного щелчка только в строке. Но проблема в том, что как только я выбираю строку и дважды щелкаю в другом месте сетки (заголовок, пустая область просмотра прокрутки и т. Д.), Событие двойного щелчка запускается, как ожидалось, но CurrentItem иногда является выбранной строкой, а иногда и нулевым.

Чтобы предотвратить такое поведение .. Мне нужно отменить выбор выбранной строки.

Есть идеи, как мне подойти к этому?

Спасибо.


person Robin Maben    schedule 27.01.2011    source источник


Ответы (2)


Вы можете выполнить поиск в визуальном дереве источника события для экземпляра типа 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);
    }
  }
}
person Zamboni    schedule 29.01.2011

Это событие запускается сеткой, а не строкой. Я имею в виду, запускается, когда вы дважды щелкаете где-нибудь в сетке, это может быть выбранная строка или нет (или не строка, которую вы просматриваете, что хуже).

Вы можете отредактировать шаблон элемента для каждой строки и включить туда событие двойного щелчка или захватить корденаты с мыши, но это немного сложно.

Надежда помогает!

person Morvader    schedule 27.01.2011
comment
захватить корденаты? .. Серьезно? - person Robin Maben; 27.01.2011
comment
Боюсь, я серьезно. social.msdn.microsoft. ru / Forums / en-US / wpf / thread / - person Morvader; 27.01.2011
comment
Ну .. Как насчет такого подхода .. techiethings .blogspot.com / 2010/05 / - person Robin Maben; 28.01.2011
comment
Извините, я согласен, что это вполне возможно, но просто не жизнеспособно для меня, в любом случае спасибо .. - person Robin Maben; 31.01.2011