dotnet/wpf · error · InvalidOperationException

SR.BindingListCanOnlySortByOneProperty

Error message

SR.BindingListCanOnlySortByOneProperty

What it means

BindingListCollectionView's internal SortDescriptionCollection override rejects adding a second SortDescription when multiple sort descriptions are not allowed, throwing InvalidOperationException(SR.BindingListCanOnlySortByOneProperty). A BindingListCollectionView backed by a plain IBindingList supports sorting by exactly one property; only IBindingListView (with SupportsAdvancedSort) permits multiple.

Solutions

  1. Clear SortDescriptions and add only one description, or wrap the data in a collection supporting multi-sort (e.g. use a ListCollectionView via ObservableCollection, or IBindingListView such as DataView/BindingSource with SupportsAdvancedSort).
  2. Implement IBindingListView on the source and set SupportsAdvancedSorting = true to allow multiple SortDescriptions.
  3. Compose the multi-property sort into a single custom sortable property or a custom comparer exposed through one SortDescription.

Example fix

// before
collectionView.SortDescriptions.Add(new SortDescription("LastName", ASC)); // ok
collectionView.SortDescriptions.Add(new SortDescription("FirstName", ASC)); // throws

// after
collectionView.SortDescriptions.Clear();
collectionView.SortDescriptions.Add(new SortDescription("FirstName", ASC)); // single sort key
Defensive patterns

Strategy: validation

Validate before calling

var blcv = collectionView as BindingListCollectionView;
if (blcv != null && blcv.SortDescriptions.Count > 0)
    blcv.SortDescriptions.Clear(); // only then Add another
collectionView.SortDescriptions.Add(new SortDescription("Name", ListSortDirection.Ascending));

Type guard

bool AllowsMultiSort(CollectionView v) =>
    v is ListCollectionView ||
    (v.SourceCollection is IBindingListView blv && blv.SupportsAdvancedSorting);

Try / catch

try { view.SortDescriptions.Add(desc); } catch (InvalidOperationException) { view.SortDescriptions.Clear(); view.SortDescriptions.Add(desc); }

Prevention

When it happens

Trigger: Calling SortDescriptions.Add a second time (Count already > 0) on a BindingListCollectionView whose source implements only IBindingList, e.g. binding a DataGrid with CanUserSortColumns on multiple columns or stacking sort criteria programmatically.

Common situations: Users shift-click a second DataGrid column header expecting multi-column sort over a BindingList/DataTable-backed source; code building multi-key sorts like SortDescriptions.Add("LastName"); SortDescriptions.Add("FirstName") against a simple BindingList<T>.

Understand the failure class

Background: UnsupportedOperationException and "is not supported" errors: when a library deliberately refuses a call — this error's family across 30 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/3456effa599d954a. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/BindingListCollectionView.cs:2515


        #endregion Private Methods

        private class BindingListSortDescriptionCollection : SortDescriptionCollection
        {
            internal BindingListSortDescriptionCollection(bool allowMultipleDescriptions)
            {
                _allowMultipleDescriptions = allowMultipleDescriptions;
            }

            /// <summary>
            /// called by base class ObservableCollection&lt;T&gt; when an item is added to list;
            /// </summary>
            protected override void InsertItem(int index, SortDescription item)
            {
                if (!_allowMultipleDescriptions && (this.Count > 0))
                {
                    throw new InvalidOperationException(SR.BindingListCanOnlySortByOneProperty);
                }
                base.InsertItem(index, item);
            }

            private bool    _allowMultipleDescriptions;
        }

        //------------------------------------------------------
        //
        //  Private Fields
        //
        //------------------------------------------------------

        #region Private Fields

        private IBindingList        _internalList;
        private CollectionViewGroupRoot _group;
        private bool                _isGrouping;

View on GitHub (pinned to 81131a70a4)