{"record":{"id":"19ccc2e21f06906f","repo":"dotnet/wpf","slug":"sr-format-sr-deferringloadernosave-nameof","errorCode":null,"errorMessage":"SR.Format(SR.DeferringLoaderNoSave, nameof(TemplateContentLoader))","messagePattern":"SR\\.Format\\(SR\\.DeferringLoaderNoSave, nameof\\(TemplateContentLoader\\)\\)","errorType":"exception","errorClass":"NotSupportedException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TemplateContentLoader.cs","lineNumber":31,"sourceCode":"            ArgumentNullException.ThrowIfNull(xamlReader);\n\n            IXamlObjectWriterFactory factory = RequireService<IXamlObjectWriterFactory>(serviceProvider);\n            return new TemplateContent(xamlReader, factory, serviceProvider);\n        }\n\n        private static T RequireService<T>(IServiceProvider provider) where T : class\n        {\n            T result = provider.GetService(typeof(T)) as T;\n            if (result == null)\n            {\n                throw new InvalidOperationException(SR.Format(SR.DeferringLoaderNoContext, nameof(TemplateContentLoader), typeof(T).Name));\n            }\n            return result;\n        }\n\n        public override XamlReader Save(object value, IServiceProvider serviceProvider)\n        {\n            throw new NotSupportedException(SR.Format(SR.DeferringLoaderNoSave, nameof(TemplateContentLoader)));\n        }\n    }\n}\n","sourceCodeStart":13,"sourceCodeEnd":35,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TemplateContentLoader.cs#L13-L35","documentation":"TemplateContentLoader only supports deferred loading; its Save override always throws NotSupportedException (SR.DeferringLoaderNoSave). Deferring content means the loader produces a XamlReader for later consumption and cannot serialize objects back to XAML.","triggerScenarios":"Calling TemplateContentLoader.Save(object, IServiceProvider) — e.g. XamlServices / XamlObjectWriter invoking the loader's Save path during serialization of a template.","commonSituations":"Trying to serialize (save) a template with deferred content back to XAML, or configuring DeferringLoader attributes and then running a save pass.","solutions":["Do not use TemplateContentLoader on the save path; let the standard XAML writer serialize the template instead.","If a template must be saved, load its deferred content fully (drain the XamlReader into an object graph) before serialization.","Wrap save operations in try/catch on NotSupportedException and fall back to full materialization of the template."],"exampleFix":"// before\nvar reader = loader.Save(template, serviceProvider); // always throws\n// after\n// materialize first, then let XamlXmlWriter handle serialization\nvar loaded = loader.Load(deferredReader, serviceProvider);\nxamlWriter.WriteNode(xamlReader = new XamlObjectReader(loaded));","handlingStrategy":"try-catch","validationCode":"if (loader is TemplateContentLoader) throw new NotSupportedException(\"TemplateContentLoader does not support Save; use default serialization\");","typeGuard":null,"tryCatchPattern":"try { writerOutput = loader.Save(value, provider); }\ncatch (NotSupportedException ex) { log(ex.Message); writerOutput = SerializeViaDefaultWriter(value); }","preventionTips":["Treat DeferringLoader-based templates as load-only","Materialize deferred content before any save pass","Check for Save support (canSave semantics) before calling"],"tags":["wpf","xaml","not-supported","serialization"],"backgroundTag":"unsupported-operation","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"}