stride3d/stride · error · InvalidOperationException

The template provider must be a dependency object in order…

Error message

The template provider must be a dependency object in order to be used correctly in the property view.

What it means

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.

Solutions

  1. Make the provider class derive from DependencyObject (like the built-in template providers) and register that instance
  2. Register a provider instance that lives in a ResourceDictionary (which is a DependencyObject)
  3. Only register providers obtained from the editor's ResourceDictionaries rather than custom implementations

Example fix

// before
class MyTemplateProvider : ITemplateProvider { ... }
service.RegisterDefaultTemplateProvider(new MyTemplateProvider());
// after
class MyTemplateProvider : DependencyObject, ITemplateProvider { ... }
service.RegisterDefaultTemplateProvider(new MyTemplateProvider());
Defensive patterns

Strategy: validation

Validate before calling

if (provider is not DependencyObject)
    throw new InvalidOperationException("Register a template provider that derives from DependencyObject");

Type guard

static bool CanRegisterTemplateProvider(ITemplateProvider p) => p is DependencyObject;

Try / catch

try { service.RegisterDefaultTemplateProvider(provider); }
catch (InvalidOperationException ex) { log.Error("Template provider must be a DependencyObject", ex); }

Prevention

When it happens

Trigger: Calling RegisterDefaultTemplateProvider (e.g. from RegisterResourceDictionary plugin setup) with a hand-written ITemplateProvider implementation that does not derive from DependencyObject.

Common situations: Implementing a custom template provider as a plain C# class instead of a ResourceDictionary/DependencyObject-based one; refactoring the provider away from DependencyObject.

Understand the failure class

Background: "Must be a positive integer", "Invalid value", "Unsupported": the invalid-argument-value error family, when a library rejects the value you pass — this error's family across 35 libraries.

Related errors


AI-assisted analysis of stride3d/stride@96fad776d2 (2026-09-14). Data as JSON: /api/errors/1ad318f3b87bd2ad. Report an issue: GitHub.

Appendix: source

Thrown at sources/editor/Stride.Core.Assets.Editor/View/EditorDialogService.cs:246

        {
            if (Application.Current.MainWindow != null)
            {
                var focusScope = FocusManager.GetFocusScope(Application.Current.MainWindow);
                FocusManager.SetFocusedElement(focusScope, Application.Current.MainWindow);
            }
        }

        public void RegisterDefaultTemplateProviders()
        {
            var dictionary = (ResourceDictionary)Application.LoadComponent(new Uri("/Stride.Core.Assets.Editor;component/View/DefaultPropertyTemplateProviders.xaml", UriKind.RelativeOrAbsolute));
            RegisterResourceDictionary(dictionary);
        }

        public void RegisterDefaultTemplateProvider(ITemplateProvider provider)
        {
            var dependencyObject = provider as DependencyObject;
            if (dependencyObject == null)
                throw new InvalidOperationException("The template provider must be a dependency object in order to be used correctly in the property view.");

            var category = PropertyViewHelper.GetTemplateCategory(dependencyObject);
            switch (category)
            {
                case PropertyViewHelper.Category.PropertyHeader:
                    PropertyViewHelper.HeaderProviders.RegisterTemplateProvider(provider);
                    break;
                case PropertyViewHelper.Category.PropertyFooter:
                    PropertyViewHelper.FooterProviders.RegisterTemplateProvider(provider);
                    break;
                case PropertyViewHelper.Category.PropertyEditor:
                    PropertyViewHelper.EditorProviders.RegisterTemplateProvider(provider);
                    break;
                default:
                    throw new ArgumentOutOfRangeException();
            }
        }

View on GitHub (pinned to 96fad776d2)