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
- 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
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
- Derive custom template providers from DependencyObject
- Reuse the editor's built-in providers from ResourceDictionaries
- Read the ITemplateProvider registration contract before implementing
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
- A dependency object is already attached to this instance of…
- A dependency object must be attached in order to register a…
- A dependency object must be attached in order to unregister…
- A dispatcher lock must be created from a different thread…
- A part named ' ' must be present in the ControlTemplate…
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)