{"record":{"id":"33f1394ed224d936","repo":"dotnet/wpf","slug":"sr-format-sr-membernotallowedduringaddoredit-deferrefresh","errorCode":null,"errorMessage":"SR.Format(SR.MemberNotAllowedDuringAddOrEdit, \"DeferRefresh\")","messagePattern":"SR\\.Format\\(SR\\.MemberNotAllowedDuringAddOrEdit, \"DeferRefresh\"\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/CollectionView.cs","lineNumber":327,"sourceCode":"                VerifyAccess();\n\n            RefreshOverride();\n\n            SetFlag(CollectionViewFlags.NeedsRefresh, false);\n        }\n\n        /// <summary>\n        /// Enter a Defer Cycle.\n        /// Defer cycles are used to coalesce changes to the ICollectionView.\n        /// </summary>\n        public virtual IDisposable DeferRefresh()\n        {\n            if (AllowsCrossThreadChanges)\n                VerifyAccess();\n\n            IEditableCollectionView ecv = this as IEditableCollectionView;\n            if (ecv != null && (ecv.IsAddingNew || ecv.IsEditingItem))\n                throw new InvalidOperationException(SR.Format(SR.MemberNotAllowedDuringAddOrEdit, \"DeferRefresh\"));\n\n            ++ _deferLevel;\n            return new DeferHelper(this);\n        }\n\n        /// <summary>\n        /// Return the \"current item\" for this view\n        /// </summary>\n        /// <remarks>\n        /// Only wrapper classes (those that pass currency handling calls to another internal\n        /// CollectionView) should override CurrentItem; all other derived classes\n        /// should use SetCurrent() to update the current values stored in the base class.\n        /// </remarks>\n        public virtual object CurrentItem\n        {\n            get\n            {\n                VerifyRefreshNotDeferred();","sourceCodeStart":309,"sourceCodeEnd":345,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Data/CollectionView.cs#L309-L345","documentation":"CollectionView.DeferRefresh throws InvalidOperationException when an AddNew or EditItem transaction is open (IsAddingNew/IsEditingItem). Deferring refresh during add/edit would freeze the view in a state that cannot reflect the pending item changes, so the call is rejected.","triggerScenarios":"Calling DeferRefresh() (to batch filter/sort description changes) while IsAddingNew or IsEditingItem is true on the same view's IEditableCollectionView implementation.","commonSituations":"Wrapping Filter/SortDescriptions updates in a defer block from an event handler that fires while a DataGrid row add/edit is in progress; batch update helpers that always call DeferRefresh unconditionally.","solutions":["Commit or cancel the pending add/edit (CommitNew/CancelNew, CommitEdit/CancelEdit) before DeferRefresh","Reorder logic: finish the edit transaction first, then open the defer scope around the property changes","Check IsAddingNew/IsEditingItem and skip deferring when a transaction is open"],"exampleFix":"// before\nusing (collectionView.DeferRefresh()) { /* change filter */ } // throws during add/edit\n// after\nif (ecv.IsAddingNew) ecv.CommitNew();\nif (ecv.IsEditingItem) ecv.CommitEdit();\nusing (collectionView.DeferRefresh()) { /* change filter */ }","handlingStrategy":"validation","validationCode":"var ecv = (IEditableCollectionView)view;\nif (ecv.IsAddingNew || ecv.IsEditingItem) ecv.CommitEdit();\nusing (view.DeferRefresh()) { /* batch changes */ }","typeGuard":"bool canDefer = view is IEditableCollectionView ecv && !ecv.IsAddingNew && !ecv.IsEditingItem;","tryCatchPattern":"try { defer = view.DeferRefresh(); }\ncatch (InvalidOperationException) { ecv.CancelEdit(); ecv.CancelNew(); defer = view.DeferRefresh(); }","preventionTips":["Close add/edit transactions before entering defer scopes","Centralize defer logic in one helper that first commits/cancels pending transactions","Never nest DeferRefresh inside edit-session event handlers without state checks"],"tags":["wpf","collectionview","deferred-refresh","editing-state"],"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-21T21:30:21.729Z"}