dotnet/wpf · error · XamlInternalException

SR.Format(SR.TemplateNotCollected, "WriteEndMember")

Error message

SR.Format(SR.TemplateNotCollected, "WriteEndMember")

What it means

XamlInternalException with SR.TemplateNotCollected thrown from DeferredWriter.WriteEndMember when the writer is in DeferringMode.TemplateReady. Closing a member while TemplateReady means the writer is still waiting for template collection to start, so an end-member write has no matching open member in any deferred region.

Solutions

  1. Balance member writes inside the deferred region only after TemplateDeferring is active
  2. Run the node stream through the standard deferring reader/writer pair instead of hand-driving WriteEndMember
  3. Reinitialize the DeferredWriter to clear the stuck TemplateReady state
  4. Validate the stream with a plain XamlXmlWriter first to catch imbalance before deferring

Example fix

// before
writer.WriteEndMember(); // _mode == TemplateReady -> TemplateNotCollected
// after
// enter deferred region first, then close members
writer.WriteStartMember(member); writer.WriteEndMember(); // balanced within TemplateDeferring
Defensive patterns

Strategy: try-catch

Try / catch

try { deferringWriter.WriteEndMember(); }
catch (XamlInternalException ex) { log.Error("WriteEndMember in TemplateReady state: {0}", ex.Message); }

Prevention

When it happens

Trigger: WriteEndMember called while _mode == TemplateReady — typically the node stream ends a member immediately after the template became ready, without the template content being collected through TemplateDeferring.

Common situations: Unbalanced WriteStartMember/WriteEndMember pairs spanning the template boundary; custom node-stream transforms that swallow the template-start event; earlier TemplateReady exceptions shifting the stream out of alignment.

Understand the failure class

Background: "This is a bug, please report it": internal invariant violations, unreachable panics, and SNH errors explained — this error's family across 47 libraries.

Related errors


AI-assisted analysis of dotnet/wpf@81131a70a4 (2026-09-14). Data as JSON: /api/errors/6cccf1fe94dcfaf9. Report an issue: GitHub.

Appendix: source

Thrown at src/Microsoft.DotNet.Wpf/src/System.Xaml/System/Xaml/InfosetObjects/DeferredWriter.cs:175

                _deferredWriter.WriteStartMember(property);
                _handled = true;
                break;

            default:
                throw new XamlInternalException(SR.Format(SR.MissingCase, _mode.ToString(), "WriteMember"));
            }
        }

        public override void WriteEndMember()
        {
            _handled = false;
            switch (_mode)
            {
            case DeferringMode.Off:
                break;

            case DeferringMode.TemplateReady:
                throw new XamlInternalException(SR.Format(SR.TemplateNotCollected, "WriteEndMember"));

            case DeferringMode.TemplateDeferring:
                _deferredWriter.WriteEndMember();
                _handled = true;
                break;

            default:
                throw new XamlInternalException(SR.Format(SR.MissingCase, _mode.ToString(), "WriteEndMember"));
            }
        }

        public override void WriteValue(object value)
        {
            _handled = false;
            switch (_mode)
            {
            case DeferringMode.Off:
                break;

View on GitHub (pinned to 81131a70a4)