//TODO GroupSorting internal void ProcessSort(KeyModifiers keyModifiers, ListSortDirection?forcedDirection = null) { // if we can sort: // - AllowUserToSortColumns and CanSort are true, and // - OwningColumn is bound // then try to sort if (OwningColumn != null && OwningGrid != null && OwningGrid.EditingRow == null && OwningColumn != OwningGrid.ColumnsInternal.FillerColumn && OwningGrid.CanUserSortColumns && OwningColumn.CanUserSort) { var ea = new DataGridColumnEventArgs(OwningColumn); OwningGrid.OnColumnSorting(ea); if (!ea.Handled && OwningGrid.DataConnection.AllowSort && OwningGrid.DataConnection.SortDescriptions != null) { // - DataConnection.AllowSort is true, and // - SortDescriptionsCollection exists, and // - the column's data type is comparable DataGrid owningGrid = OwningGrid; DataGridSortDescription newSort; KeyboardHelper.GetMetaKeyState(keyModifiers, out bool ctrl, out bool shift); DataGridSortDescription sort = OwningColumn.GetSortDescription(); IDataGridCollectionView collectionView = owningGrid.DataConnection.CollectionView; Debug.Assert(collectionView != null); using (collectionView.DeferRefresh()) { // if shift is held down, we multi-sort, therefore if it isn't, we'll clear the sorts beforehand if (!shift || owningGrid.DataConnection.SortDescriptions.Count == 0) { owningGrid.DataConnection.SortDescriptions.Clear(); } // if ctrl is held down, we only clear the sort directions if (!ctrl) { if (sort != null) { if (forcedDirection == null || sort.Direction != forcedDirection) { newSort = sort.SwitchSortDirection(); } else { newSort = sort; } // changing direction should not affect sort order, so we replace this column's // sort description instead of just adding it to the end of the collection int oldIndex = owningGrid.DataConnection.SortDescriptions.IndexOf(sort); if (oldIndex >= 0) { owningGrid.DataConnection.SortDescriptions.Remove(sort); owningGrid.DataConnection.SortDescriptions.Insert(oldIndex, newSort); } else { owningGrid.DataConnection.SortDescriptions.Add(newSort); } } else if (OwningColumn.CustomSortComparer != null) { newSort = forcedDirection != null? DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer, forcedDirection.Value) : DataGridSortDescription.FromComparer(OwningColumn.CustomSortComparer); owningGrid.DataConnection.SortDescriptions.Add(newSort); } else { string propertyName = OwningColumn.GetSortPropertyName(); // no-opt if we couldn't find a property to sort on if (string.IsNullOrEmpty(propertyName)) { return; } newSort = DataGridSortDescription.FromPath(propertyName, culture: collectionView.Culture); if (forcedDirection != null && newSort.Direction != forcedDirection) { newSort = newSort.SwitchSortDirection(); } owningGrid.DataConnection.SortDescriptions.Add(newSort); } } } } } }