Editace ve WPF DataGridu jedním kliknutím myši


Editace ve WPF DataGridu je ve výchozím stavu aktivní přes double-click myši. Jak to jednoduše změnit a editovat v DataGridu přímým proklikem, tedy jedním kliknutím myši?

Klíčem úspěchu je použití eventu PreviewMouseLeftButtonDown a jeho aplikace pomocí EventSetteru na všechny DataGridCell v DataGridu, čehož dosáhneme přidáním následujícího XAML kódu někam do Resources, např. právě v DataGridu:

<DataGrid.Resources>
  <Style TargetType="{x:Type DataGridCell}">
    <EventSetter Event="PreviewMouseLeftButtonDown" 
                 Handler="DataGridCell_PreviewMouseLeftButtonDown" />
  </Style>
  </DataGrid.Resources>

A dále samotný kód události:

private void DataGridCell_PreviewMouseLeftButtonDown(object sender, MouseButtonEventArgs e)
{
  DataGridCell cell = sender as DataGridCell;
  if (cell != null && !cell.IsEditing && !cell.IsReadOnly)
  {
    if (!cell.IsFocused)
      cell.Focus();
    DataGrid dataGrid = FindVisualParent<DataGrid>(cell);
    if (dataGrid != null)
    {
      if (dataGrid.SelectionUnit != DataGridSelectionUnit.FullRow)
      {
        if (!cell.IsSelected)
          cell.IsSelected = true;
      }
      else
      {
        DataGridRow row = FindVisualParent<DataGridRow>(cell);
        if (row != null && !row.IsSelected)
          row.IsSelected = true;
      }
    }
  }
}

public static T FindVisualParent<T>(UIElement element)
  where T : UIElement
{
  UIElement parent = element;
  while (parent != null)
  {
    T correctlyTyped = parent as T;
    if (correctlyTyped == null)
      parent = VisualTreeHelper.GetParent(parent) as UIElement;
    else
      return correctlyTyped;
  }
  return null;
}

TIP: Statickou metodu FindVisualParent je samozřejmě možné použít i kdekoliv jinde a najít tak požadovaný rodičovský GUI prvek.

Zdroj: DataGrid Tips & Tricks: Single-Click Editing

, , , , ,

Komentáře jsou uzavřeny.