/// <summary> /// Updates the focused <see cref="DataGridColumnHeader"/>. /// </summary> private static void UpdateFocusedHeader(DataGridControl datagrid) { if (null == datagrid) { return; } // Get the list of headers IList <DependencyObject> headers = VisualTreeHelperExtended.GetAllDescendants(datagrid, typeof(DataGridColumnHeader)); if (null == headers || 0 == headers.Count) { return; } // Update the focus based on the current tracking Modes FocusTrackingModes trackingModes = GetTrackingModes(datagrid); if (0 != (trackingModes & FocusTrackingModes.Headers)) { // Get the focused cell, if any, and look for an ancestor cell when editing cell DataGridCell cell = Keyboard.FocusedElement as DataGridCell; if (cell == null) { cell = VisualTreeHelperExtended.GetAncestor(Keyboard.FocusedElement as FrameworkElement, typeof(DataGridCell)) as DataGridCell; } // Update header focus, if any foreach (DataGridColumnHeader header in headers) { // Determine if the column associated with this header if focused bool isFocused = (null != cell && cell.Column == header.Column); // Update the focus for this header if (isFocused != GetIsFocusedHeader(header)) { if (isFocused) { header.SetValue(IsFocusedHeaderPropertyKey, true); } else { header.ClearValue(IsFocusedHeaderPropertyKey); } } } } else { // Clear header focus, if any foreach (DataGridColumnHeader header in headers) { if (GetIsFocusedHeader(header)) { header.ClearValue(IsFocusedHeaderPropertyKey); } } } }
public static void SetTrackingModes(DataGridControl obj, FocusTrackingModes value) { if (null == obj) { throw new ArgumentNullException("obj"); } obj.SetValue(FocusBehavior.TrackingModesProperty, value); }
/// <summary> /// Called when <see cref="TrackingModesProperty"/> is changed. /// </summary> /// <param name="d">The dependency object that was changed.</param> /// <param name="e">The <see cref="DependencyPropertyChangedEventArgs"/> instance containing the event data.</param> private static void OnTrackingModesPropertyValueChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) { DataGridControl datagrid = d as DataGridControl; if (null == datagrid) { return; } FocusTrackingModes trackingModes = (FocusTrackingModes)e.NewValue; if (FocusTrackingModes.None != trackingModes) { datagrid.AddHandler(UIElement.GotFocusEvent, (RoutedEventHandler)OnDataGridGotFocus, true); datagrid.AddHandler(UIElement.LostFocusEvent, (RoutedEventHandler)OnDataGridLostFocus, true); } else { datagrid.RemoveHandler(UIElement.GotFocusEvent, (RoutedEventHandler)OnDataGridGotFocus); datagrid.RemoveHandler(UIElement.LostFocusEvent, (RoutedEventHandler)OnDataGridLostFocus); } UpdateFocusedHeader(datagrid); }