{"record":{"id":"324228c231bb6d56","repo":"dotnet/wpf","slug":"sr-format-sr-deferringloadernocontext-nameof-324228","errorCode":null,"errorMessage":"SR.Format(SR.DeferringLoaderNoContext, nameof(TemplateContentLoader), typeof(T).Name)","messagePattern":"SR\\.Format\\(SR\\.DeferringLoaderNoContext, nameof\\(TemplateContentLoader\\), typeof\\(T\\)\\.Name\\)","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TemplateContentLoader.cs","lineNumber":24,"sourceCode":"namespace System.Windows\n{\n    public class TemplateContentLoader : XamlDeferringLoader\n    {\n        public override object Load(XamlReader xamlReader, IServiceProvider serviceProvider)\n        {\n            ArgumentNullException.ThrowIfNull(serviceProvider);\n            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":6,"sourceCodeEnd":35,"githubUrl":"https://github.com/dotnet/wpf/blob/81131a70a4c573cd62748a5c36908fc4d662daa9/src/Microsoft.DotNet.Wpf/src/PresentationFramework/System/Windows/TemplateContentLoader.cs#L6-L35","documentation":"TemplateContentLoader.RequireService<T> fetches a required XAML service from the IServiceProvider; if the service is absent it throws InvalidOperationException (SR.DeferringLoaderNoContext), meaning TemplateContentLoader is being used outside a proper XAML parse/save context.","triggerScenarios":"Calling Load or Save on TemplateContentLoader while passing an IServiceProvider that does not supply the required service (e.g. IXamlSchemaContextProvider / IAmbientProvider), or passing a null/empty provider.","commonSituations":"Invoking the deferring content loader manually in unit tests or custom XAML pipelines without a real XamlXmlReader/Writer context; reusing the loader outside System.Xaml parsing.","solutions":["Only use TemplateContentLoader through a normal XAML load/save pipeline where System.Xaml supplies its services.","In custom pipelines, pass an IServiceProvider backed by a real XamlSchemaContext (e.g. from XamlXmlReader/Writer).","Wrap loader calls in try/catch on InvalidOperationException and surface which service typeof(T).Name was missing.","Register the expected service on a custom service provider if you must fake the context in tests."],"exampleFix":"// before\nloader.Load(reader, new EmptyServiceProvider()); // no services\n// after\nusing var reader = new XamlXmlReader(stream); // provides schema context services\nvar value = loader.Load(reader, reader.SchemaContext != null ? serviceProvider : null);","handlingStrategy":"validation","validationCode":"bool hasContext = provider?.GetService(typeof(IXamlSchemaContextProvider)) != null;\nif (!hasContext) throw new InvalidOperationException(\"TemplateContentLoader requires a System.Xaml parse context\");","typeGuard":"static bool HasRequiredServices(IServiceProvider p) => p?.GetService(typeof(IXamlSchemaContextProvider)) != null;","tryCatchPattern":"try { value = loader.Load(reader, provider); }\ncatch (InvalidOperationException ex) { log(ex.Message); value = XamlServices.Load(readerStream); }","preventionTips":["Only invoke TemplateContentLoader from within a real XamlReader/Writer pipeline","Don't hand-roll IServiceProviders in production code","In tests, back the provider with a XamlSchemaContext"],"tags":["wpf","xaml","service-provider","missing-context"],"backgroundTag":"missing-dependency","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"}