{"record":{"id":"05bc0a0d69779d00","repo":"dotnet/wpf","slug":"sr-format-sr-templatenotcollected-writemember","errorCode":null,"errorMessage":"SR.Format(SR.TemplateNotCollected, \"WriteMember\")","messagePattern":"SR\\.Format\\(SR\\.TemplateNotCollected, \"WriteMember\"\\)","errorType":"exception","errorClass":"XamlInternalException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/InfosetObjects/DeferredWriter.cs","lineNumber":154,"sourceCode":"\n        public override void WriteStartMember(XamlMember property)\n        {\n            _handled = false;\n            switch (_mode)\n            {\n            case DeferringMode.Off:\n                if (property.DeferringLoader is not null)\n                {\n                    _mode = DeferringMode.TemplateStarting;\n\n                    // We assume in WriteValue that this property can never be multi-valued\n                    Debug.Assert(!property.IsDirective && !property.IsUnknown);\n                }\n\n                break;\n\n            case DeferringMode.TemplateReady:\n                throw new XamlInternalException(SR.Format(SR.TemplateNotCollected, \"WriteMember\"));\n\n            case DeferringMode.TemplateDeferring:\n                _deferredWriter.WriteStartMember(property);\n                _handled = true;\n                break;\n\n            default:\n                throw new XamlInternalException(SR.Format(SR.MissingCase, _mode.ToString(), \"WriteMember\"));\n            }\n        }\n\n        public override void WriteEndMember()\n        {\n            _handled = false;\n            switch (_mode)\n            {\n            case DeferringMode.Off:\n                break;","sourceCodeStart":136,"sourceCodeEnd":172,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/InfosetObjects/DeferredWriter.cs#L136-L172","documentation":"XamlInternalException with SR.TemplateNotCollected thrown from DeferredWriter.WriteStartMember when the writer is in DeferringMode.TemplateReady. Starting a member in TemplateReady state means the template content was never collected through the TemplateStarting -> StartDeferredList transition, so member writes are invalid.","triggerScenarios":"WriteStartMember called while _mode == TemplateReady — for instance the template-start node (x:ClassModifier-style template content start) was consumed into TemplateReady but the next write was a plain member write instead of entering the deferred list.","commonSituations":"Custom node-stream rewriters that drop or reorder the node that triggers StartDeferredList; writing template content with a raw writer API without going through the deferring reader's template flow; test harnesses emitting synthetic node streams around templates.","solutions":["Emit the member writes only after the writer entered TemplateDeferring (i.e. after StartDeferredList ran)","Drive serialization through XamlDeferringReader/XamlDeferringWriter rather than calling WriteStartMember manually in TemplateReady","Reset the writer (new DeferredWriter) so _mode is Off for non-template content","Add a pre-write assertion/check of the deferring mode in custom writer code"],"exampleFix":"// before\nwriter.WriteStartMember(member); // _mode == TemplateReady -> TemplateNotCollected\n// after\n// let the template-start path run StartDeferredList first (TemplateStarting -> TemplateDeferring)\nwriter.WriteStartMember(member); // now valid inside deferred region","handlingStrategy":"try-catch","validationCode":null,"typeGuard":null,"tryCatchPattern":"try { deferringWriter.WriteStartMember(member); }\ncatch (XamlInternalException ex) { log.Error(\"WriteStartMember in TemplateReady state: {0}\", ex.Message); }","preventionTips":["Only write members inside the deferred region (TemplateDeferring active)","Do not hand-call WriteStartMember around template boundaries","Reset the writer state machine after template errors","Assert the deferring mode in custom writer code during development"],"tags":["xaml","internal-exception","deferring-writer","state-machine"],"backgroundTag":"internal-invariant-violation","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"}