{"record":{"id":"e9fcad93fab4e0cb","repo":"dotnet/wpf","slug":"sr-moveindeferselectionactive","errorCode":null,"errorMessage":"SR.MoveInDeferSelectionActive","messagePattern":"SR\\.MoveInDeferSelectionActive","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/SelectedItemCollection.cs","lineNumber":127,"sourceCode":"                using (ChangeSelectedItems())\n                {\n                    base.SetItem(index, item);\n                }\n            }\n        }\n\n        /// <summary>\n        /// Movea an item from one position to another\n        /// </summary>\n        /// <param name=\"oldIndex\">index of the column which is being moved</param>\n        /// <param name=\"newIndex\">index of the column to be move to</param>\n        protected override void MoveItem(int oldIndex, int newIndex)\n        {\n            if (oldIndex != newIndex)\n            {\n                if (_updatingSelectedItems)\n                {\n                    throw new InvalidOperationException(SR.MoveInDeferSelectionActive);\n                }\n                else\n                {\n                    using (ChangeSelectedItems())\n                    {\n                        base.MoveItem(oldIndex, newIndex);\n                    }\n                }\n            }\n        }\n\n        #endregion\n\n        #region Reentrant changes\n\n        internal bool IsChanging { get { return (_changeCount > 0); } }\n\n        private IDisposable ChangeSelectedItems()","sourceCodeStart":109,"sourceCodeEnd":145,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/SelectedItemCollection.cs#L109-L145","documentation":"SelectedItemCollection.MoveItem reorders an item in SelectedItems and is forbidden while _updatingSelectedItems is true. Moving items during the deferred selection commit would invalidate the SelectionChange state, so an InvalidOperationException is thrown (only when oldIndex != newIndex).","triggerScenarios":"Calling SelectedItems.Move(oldIndex, newIndex) inside an UpdateSelectedItems block or from a callback invoked while selection change is active (SelectionChanged, OnSelectedCellsChanged, OnExecutedDelete).","commonSituations":"Reordering selected items from selection-change event handlers; drag-drop reordering implemented on SelectedItems during a bulk selection update.","solutions":["Call Move after the deferred selection scope has ended.","Defer the Move with Dispatcher.BeginInvoke if it must react to a selection event.","Don't reorder SelectedItems directly; operate on the underlying Items collection instead.","Use UpdateSelectedItems only for Add/Remove of selections, not Move."],"exampleFix":"// before\nlistBox.SelectedItems.Move(0, 2); // inside UpdateSelectedItems\n// after\nDispatcher.BeginInvoke(new Action(() => listBox.SelectedItems.Move(0, 2)));","handlingStrategy":"validation","validationCode":"if (oldIndex != newIndex && !isInsideUpdateSelectedItemsBlock) listBox.SelectedItems.Move(oldIndex, newIndex);","typeGuard":null,"tryCatchPattern":"try { listBox.SelectedItems.Move(oldIndex, newIndex); }\ncatch (InvalidOperationException) { Dispatcher.BeginInvoke(new Action(() => listBox.SelectedItems.Move(oldIndex, newIndex))); }","preventionTips":["Reorder outside deferred selection scopes.","Don't call Move from SelectionChanged handlers.","Use Dispatcher to defer reordering until selection change completes.","Track update-scope state in selection helper code."],"tags":["wpf","selector","selection","invalid-operation"],"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"}