{"record":{"id":"04100b249be6d39a","repo":"dotnet/wpf","slug":"sr-format-sr-membernotallowedduringaddoredit-grouping-04100b","errorCode":null,"errorMessage":"SR.Format(SR.MemberNotAllowedDuringAddOrEdit, \"Grouping\")","messagePattern":"SR\\.Format\\(SR\\.MemberNotAllowedDuringAddOrEdit, \"Grouping\"\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/ListCollectionView.cs","lineNumber":483,"sourceCode":"\n                RefreshOrDefer();\n            }\n        }\n\n        /// <summary>\n        /// A delegate to select the group description as a function of the\n        /// parent group and its level.\n        /// </summary>\n        [DefaultValue(null)]\n        public virtual GroupDescriptionSelectorCallback GroupBySelector\n        {\n            get { return _group.GroupBySelector; }\n            set\n            {\n                if (!CanGroup)\n                    throw new NotSupportedException();\n                if (IsAddingNew || IsEditingItem)\n                    throw new InvalidOperationException(SR.Format(SR.MemberNotAllowedDuringAddOrEdit, \"Grouping\"));\n\n                _group.GroupBySelector = value;\n\n                RefreshOrDefer();\n            }\n        }\n\n        /// <summary>\n        /// Return the estimated number of records (or -1, meaning \"don't know\").\n        /// </summary>\n        public override int Count\n        {\n            get\n            {\n                VerifyRefreshNotDeferred();\n\n                return InternalCount;\n            }","sourceCodeStart":465,"sourceCodeEnd":501,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/ListCollectionView.cs#L465-L501","documentation":"ListCollectionView.GroupBySelector cannot be changed while an AddNew or EditItem transaction is open. Assigning it mid-transaction throws InvalidOperationException with the resource string MemberNotAllowedDuringAddOrEdit(\"Grouping\").","triggerScenarios":"Setting GroupBySelector after AddNew() or EditItem() without committing/cancelling the transaction first (the CanGroup check at line 481 passed, so grouping is enabled).","commonSituations":"A grouping-UI control (e.g. a group-by dropdown) updating the selector while a DataGrid row is being added or edited; programmatic reconfiguration of grouping during an active transaction.","solutions":["Call CommitNew/CommitEdit (or CancelNew/CancelEdit) before assigning GroupBySelector","Guard the assignment with checks of IsAddingNew and IsEditingItem (cast to IEditableCollectionView if needed)","Reapply grouping changes after the transaction completes"],"exampleFix":"// before\nview.GroupBySelector = selector; // throws during EditItem\n// after\nvar ecv = (IEditableCollectionView)view;\nif (ecv.IsEditingItem) ecv.CommitEdit();\nif (ecv.IsAddingNew) ecv.CommitNew();\nview.GroupBySelector = selector;","handlingStrategy":"validation","validationCode":"var ecv = collectionView as IEditableCollectionView;\nif (!(collectionView.IsAddingNew || (ecv != null && ecv.IsEditingItem)))\n    view.GroupBySelector = selector;","typeGuard":null,"tryCatchPattern":"try { view.GroupBySelector = selector; }\ncatch (InvalidOperationException)\n{\n    // defer grouping change until the transaction ends\n}","preventionTips":["Gate grouping reconfiguration on absence of open transactions","Have group-by UI controls commit pending DataGrid edits before applying changes","Route all grouping mutations through a single guarded helper"],"tags":["wpf","data-binding","invalidoperationexception","listcollectionview","grouping"],"backgroundTag":"invalid-state-transition","analyzedSha":"81131a70a4c573cd62748a5c36908fc4d662daa9","analyzedAt":"2026-09-14T10:12:48.479Z","contentChangedAt":"2026-09-14T10:12:48.479Z","schemaVersion":2},"datasetVersion":"2026-09-22T01:17:13.364Z"}