{"record":{"id":"3456effa599d954a","repo":"dotnet/wpf","slug":"sr-bindinglistcanonlysortbyoneproperty","errorCode":null,"errorMessage":"SR.BindingListCanOnlySortByOneProperty","messagePattern":"SR\\.BindingListCanOnlySortByOneProperty","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/BindingListCollectionView.cs","lineNumber":2515,"sourceCode":"\n\n        #endregion Private Methods\n\n        private class BindingListSortDescriptionCollection : SortDescriptionCollection\n        {\n            internal BindingListSortDescriptionCollection(bool allowMultipleDescriptions)\n            {\n                _allowMultipleDescriptions = allowMultipleDescriptions;\n            }\n\n            /// <summary>\n            /// called by base class ObservableCollection&lt;T&gt; when an item is added to list;\n            /// </summary>\n            protected override void InsertItem(int index, SortDescription item)\n            {\n                if (!_allowMultipleDescriptions && (this.Count > 0))\n                {\n                    throw new InvalidOperationException(SR.BindingListCanOnlySortByOneProperty);\n                }\n                base.InsertItem(index, item);\n            }\n\n            private bool    _allowMultipleDescriptions;\n        }\n\n        //------------------------------------------------------\n        //\n        //  Private Fields\n        //\n        //------------------------------------------------------\n\n        #region Private Fields\n\n        private IBindingList        _internalList;\n        private CollectionViewGroupRoot _group;\n        private bool                _isGrouping;","sourceCodeStart":2497,"sourceCodeEnd":2533,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/BindingListCollectionView.cs#L2497-L2533","documentation":"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.","triggerScenarios":"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.","commonSituations":"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>.","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."],"exampleFix":"// before\ncollectionView.SortDescriptions.Add(new SortDescription(\"LastName\", ASC)); // ok\ncollectionView.SortDescriptions.Add(new SortDescription(\"FirstName\", ASC)); // throws\n\n// after\ncollectionView.SortDescriptions.Clear();\ncollectionView.SortDescriptions.Add(new SortDescription(\"FirstName\", ASC)); // single sort key","handlingStrategy":"validation","validationCode":"var blcv = collectionView as BindingListCollectionView;\nif (blcv != null && blcv.SortDescriptions.Count > 0)\n    blcv.SortDescriptions.Clear(); // only then Add another\ncollectionView.SortDescriptions.Add(new SortDescription(\"Name\", ListSortDirection.Ascending));","typeGuard":"bool AllowsMultiSort(CollectionView v) =>\n    v is ListCollectionView ||\n    (v.SourceCollection is IBindingListView blv && blv.SupportsAdvancedSorting);","tryCatchPattern":"try { view.SortDescriptions.Add(desc); } catch (InvalidOperationException) { view.SortDescriptions.Clear(); view.SortDescriptions.Add(desc); }","preventionTips":["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"],"tags":["wpf","sorting","collection-view","bindinglist"],"backgroundTag":"unsupported-operation","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-21T21:30:21.729Z"}