Category / Section
How to navigate to the multiple controls loaded in GridTemplateColumn by Tab Key in WPF DataGrid (SfDataGrid)?
1 min read
WPF DataGrid (SfDataGrid) does not support navigation to controls within GridTemplateColumn. You can achieve this by overriding ShouldGridTryToHandleKeyDown method in GridCellTemplateRenderer.
public class SfDataGridBehavior : Behavior<SfDataGrid>
{
protected override void OnAttached()
{
base.OnAttached();
this.AssociatedObject.CellRenderers.Remove("Template");
this.AssociatedObject.CellRenderers.Add("Template", new CustomGridCellTemplateRenderer());
}
}public class CustomGridCellTemplateRenderer : GridCellTemplateRenderer
{
private FrameworkElement PreviousCurrentCellElement = null;
public CustomGridCellTemplateRenderer()
{
}
protected override bool ShouldGridTryToHandleKeyDown(KeyEventArgs e)
{
if (e.Key != Key.Tab)
return base.ShouldGridTryToHandleKeyDown(e);
bool isShiftPressed = SelectionHelper.CheckShiftKeyPressed();
UIElement currentFocusedElement = Keyboard.FocusedElement as UIElement;
var currentCell = this.DataGrid.SelectionController.CurrentCellManager.CurrentCell;
var columnElement = currentCell.ColumnElement;
//Column with Multiple controls inside DataTemplate.
if (currentCell.GridColumn.MappingName != "SalesID")
return base.ShouldGridTryToHandleKeyDown(e);
if (PreviousCurrentCellElement != columnElement && currentFocusedElement is SfDataGrid)
{
FocusNavigationDirection focusNavigationDirection = isShiftPressed ? FocusNavigationDirection.Last : FocusNavigationDirection.First;
TraversalRequest tRequest = new TraversalRequest(focusNavigationDirection);
//To navigate from other column to template column
if (columnElement.MoveFocus(tRequest))
{
e.Handled = true;
PreviousCurrentCellElement = columnElement;
return false;
}
}
else
{
FocusNavigationDirection focusNavigationDirection = isShiftPressed ? FocusNavigationDirection.First : FocusNavigationDirection.Last;
TraversalRequest traversalRequest = new TraversalRequest(focusNavigationDirection);
if (columnElement.MoveFocus(traversalRequest))
{
if (Keyboard.FocusedElement != currentFocusedElement)
{
Keyboard.Focus(currentFocusedElement);
PreviousCurrentCellElement = columnElement;
return false;
}
//To navigate to other columns from template column
else
{
Keyboard.Focus(currentFocusedElement);
PreviousCurrentCellElement = null;
return base.ShouldGridTryToHandleKeyDown(e);
}
}
}
PreviousCurrentCellElement = columnElement;
return base.ShouldGridTryToHandleKeyDown(e);
}
}
Didn't find an answer?
Contact Support