{"record":{"id":"28bad6fbd7dc80d0","repo":"dotnet/wpf","slug":"sr-panelisnotitemshost","errorCode":null,"errorMessage":"SR.PanelIsNotItemsHost","messagePattern":"SR\\.PanelIsNotItemsHost","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/ItemContainerGenerator.cs","lineNumber":168,"sourceCode":"            }\n        }\n\n\n        //------------------------------------------------------\n        //\n        //  Public Methods\n        //\n        //------------------------------------------------------\n\n        #region IItemContainerGenerator\n\n        /// <summary>\n        /// Return the ItemContainerGenerator appropriate for use by the given panel\n        /// </summary>\n        ItemContainerGenerator IItemContainerGenerator.GetItemContainerGeneratorForPanel(Panel panel)\n        {\n            if (!panel.IsItemsHost)\n                throw new ArgumentException(SR.PanelIsNotItemsHost, nameof(panel));\n\n            // if panel came from an ItemsPresenter, use its generator\n            ItemsPresenter ip = ItemsPresenter.FromPanel(panel);\n            if (ip != null)\n                return ip.Generator;\n\n            // if panel came from a style, use the main generator\n            if (panel.TemplatedParent != null)\n                return this;\n\n            // otherwise the panel doesn't have a generator\n            return null;\n        }\n\n        /// <summary> Begin generating at the given position and direction </summary>\n        /// <remarks>\n        /// This method must be called before calling GenerateNext.  It returns an\n        /// IDisposable object that tracks the lifetime of the generation loop.","sourceCodeStart":150,"sourceCodeEnd":186,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/Controls/ItemContainerGenerator.cs#L150-L186","documentation":"IItemContainerGenerator.GetItemContainerGeneratorForPanel returns the generator a panel should use, and only accepts a panel acting as an items host. If panel.IsItemsHost is false it throws ArgumentException(SR.PanelIsNotItemsHost, nameof(panel)).","triggerScenarios":"Calling GetItemContainerGeneratorForPanel with a Panel whose IsItemsHost is false — e.g. a layout panel inside an ItemsControl that is not the items presenter's panel.","commonSituations":"Custom panel code asking for the generator from the wrong panel; a panel not connected through an ItemsPresenter (IsItemsHost not set or not templated as the items host).","solutions":["Pass the panel that is actually the items host (ItemsPresenter's panel, IsItemsHost == true)","If using a custom panel, set ItemsPresenter or ensure the panel is the one generated by the ItemsControl template","Check panel.IsItemsHost before calling"],"exampleFix":"// before\nvar gen = generator.GetItemContainerGeneratorForPanel(innerCanvas); // not items host\n// after\nif (innerCanvas.IsItemsHost)\n    gen = generator.GetItemContainerGeneratorForPanel(innerCanvas);","handlingStrategy":"validation","validationCode":"if (panel.IsItemsHost) { var gen = iicg.GetItemContainerGeneratorForPanel(panel); }","typeGuard":"bool usablePanel = panel != null && panel.IsItemsHost;","tryCatchPattern":"try { gen = iicg.GetItemContainerGeneratorForPanel(panel); } catch (ArgumentException ex) { /* panel is not the items host */ }","preventionTips":["Only pass the panel produced by the ItemsPresenter","Check IsItemsHost before requesting a generator","In custom panels, resolve the generator via ItemsControl.GetItemContainerGenerator or the presenter"],"tags":["wpf","itemcontainergenerator","panel"],"backgroundTag":"invalid-argument-value","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"}