{"record":{"id":"1ad318f3b87bd2ad","repo":"stride3d/stride","slug":"the-template-provider-must-be-a-dependency-object-in-order","errorCode":null,"errorMessage":"The template provider must be a dependency object in order to be used correctly in the property view.","messagePattern":"The template provider must be a dependency object in order to be used correctly in the property view\\.","errorType":"exception","errorClass":"InvalidOperationException","httpStatus":null,"severity":"error","filePath":"sources/editor/Stride.Core.Assets.Editor/View/EditorDialogService.cs","lineNumber":246,"sourceCode":"        {\n            if (Application.Current.MainWindow != null)\n            {\n                var focusScope = FocusManager.GetFocusScope(Application.Current.MainWindow);\n                FocusManager.SetFocusedElement(focusScope, Application.Current.MainWindow);\n            }\n        }\n\n        public void RegisterDefaultTemplateProviders()\n        {\n            var dictionary = (ResourceDictionary)Application.LoadComponent(new Uri(\"/Stride.Core.Assets.Editor;component/View/DefaultPropertyTemplateProviders.xaml\", UriKind.RelativeOrAbsolute));\n            RegisterResourceDictionary(dictionary);\n        }\n\n        public void RegisterDefaultTemplateProvider(ITemplateProvider provider)\n        {\n            var dependencyObject = provider as DependencyObject;\n            if (dependencyObject == null)\n                throw new InvalidOperationException(\"The template provider must be a dependency object in order to be used correctly in the property view.\");\n\n            var category = PropertyViewHelper.GetTemplateCategory(dependencyObject);\n            switch (category)\n            {\n                case PropertyViewHelper.Category.PropertyHeader:\n                    PropertyViewHelper.HeaderProviders.RegisterTemplateProvider(provider);\n                    break;\n                case PropertyViewHelper.Category.PropertyFooter:\n                    PropertyViewHelper.FooterProviders.RegisterTemplateProvider(provider);\n                    break;\n                case PropertyViewHelper.Category.PropertyEditor:\n                    PropertyViewHelper.EditorProviders.RegisterTemplateProvider(provider);\n                    break;\n                default:\n                    throw new ArgumentOutOfRangeException();\n            }\n        }\n","sourceCodeStart":228,"sourceCodeEnd":264,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/editor/Stride.Core.Assets.Editor/View/EditorDialogService.cs#L228-L264","documentation":"EditorDialogService.RegisterDefaultTemplateProvider registers an ITemplateProvider for the property view, but the PropertyViewHelper resolves template categories through the provider's attached properties, so the provider must also be a DependencyObject. Passing a plain class implementing ITemplateProvider throws InvalidOperationException.","triggerScenarios":"Calling RegisterDefaultTemplateProvider (e.g. from RegisterResourceDictionary plugin setup) with a hand-written ITemplateProvider implementation that does not derive from DependencyObject.","commonSituations":"Implementing a custom template provider as a plain C# class instead of a ResourceDictionary/DependencyObject-based one; refactoring the provider away from DependencyObject.","solutions":["Make the provider class derive from DependencyObject (like the built-in template providers) and register that instance","Register a provider instance that lives in a ResourceDictionary (which is a DependencyObject)","Only register providers obtained from the editor's ResourceDictionaries rather than custom implementations"],"exampleFix":"// before\nclass MyTemplateProvider : ITemplateProvider { ... }\nservice.RegisterDefaultTemplateProvider(new MyTemplateProvider());\n// after\nclass MyTemplateProvider : DependencyObject, ITemplateProvider { ... }\nservice.RegisterDefaultTemplateProvider(new MyTemplateProvider());","handlingStrategy":"validation","validationCode":"if (provider is not DependencyObject)\n    throw new InvalidOperationException(\"Register a template provider that derives from DependencyObject\");","typeGuard":"static bool CanRegisterTemplateProvider(ITemplateProvider p) => p is DependencyObject;","tryCatchPattern":"try { service.RegisterDefaultTemplateProvider(provider); }\ncatch (InvalidOperationException ex) { log.Error(\"Template provider must be a DependencyObject\", ex); }","preventionTips":["Derive custom template providers from DependencyObject","Reuse the editor's built-in providers from ResourceDictionaries","Read the ITemplateProvider registration contract before implementing"],"tags":["wpf","dependency-object","api-misuse"],"backgroundTag":"invalid-argument-value","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}