I need to deselect a row when a...">

Unselect row in wpf datagrid

I have

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

I need to deselect a row when a click event occurs elsewhere than the Datagrid row.

i.e. grid.CurrentItemit should benull

I need to fire an event with two clicks in a row only . But the problem is that after selecting a row and double-clicking elsewhere in the grid (heading, empty scrollviewer, etc.), the Double-Click event fires as expected, but CurrentItem is sometimes the selected row, and sometimes zero.

To prevent this behavior. I need to deselect the selected row.

Any ideas on how I should approach this?

Thank.

+3
source share
2 answers

You can search the event tree of the event source for an instance of type DataGridRow to determine whether you double-clicked on a row or somewhere else.

The following Double Click event detection site in the WPF DataGrid provides a good example.
I have included the code here if the site is no longer available.

Here is the double click event handler:

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;
}

Here is the code to help you search the tree:

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 not a ContentElement/FrameworkElement, rely on VisualTreeHelper
      return VisualTreeHelper.GetParent(child);
    }
  }
}
+5
source

This event is fired by a grid, not a string. I mean, I’m fired when you double-click somewhere in the grid, it can be the selected row or not (or not the row that you have worse).

itemtemplate , .

!

0

Source: https://habr.com/ru/post/1788159/


All Articles