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
- 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).
- Implement IBindingListView on the source and set SupportsAdvancedSorting = true to allow multiple SortDescriptions.
- 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
- Keep at most one SortDescription on a BindingListCollectionView
- Check that the source is IBindingListView with SupportsAdvancedSorting before multi-sort
- Clear existing sort descriptions before adding a new key
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
- SR.DataGrid_ProbableInvalidSortDescription
- InvalidEnumArgumentException(direction, (int)direction…
- SR.AddedItemNotAtIndex (formatted with index)
- SR.AddedItemNotInCollection
- SR.BindingListCannotCustomFilter
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<T> 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)