HandyOrg/HandyControl · error · InvalidOperationException
ExceptionStringTable.TypeConstraintViolatedExceptionMessage
Error message
ExceptionStringTable.TypeConstraintViolatedExceptionMessage
What it means
Attach validates the incoming DependencyObject against the behavior's AssociatedType constraint. If the object is not an instance of AssociatedType (set via AssociatedTypeAttribute or the default), InvalidOperationException TypeConstraintViolatedExceptionMessage is thrown, naming the behavior type, the actual object type, and the expected type.
Solutions
- Attach the behavior only to objects compatible with its AssociatedType; check AssociatedType.IsInstanceOfType(target) first.
- If the wrong element type is used in XAML, move or retype the element (or use a less constrained behavior).
- Update the AssociatedTypeAttribute if the constraint is overly restrictive for your usage.
- Add a debug assertion in code that builds behaviors dynamically.
Example fix
// before
button.SetValue(Interaction.BehaviorsProperty, new BehaviorCollection { textBoxBehavior }); // throws
// after
if (behavior.AssociatedType.IsInstanceOfType(target))
target.SetValue(Interaction.BehaviorsProperty, new BehaviorCollection { behavior }); Defensive patterns
Strategy: validation
Validate before calling
if (target == null || !behavior.AssociatedType.IsInstanceOfType(target))
throw new ArgumentException($"{target?.GetType().Name} is not compatible with {behavior.AssociatedType.Name}"); Type guard
static bool MatchesAssociatedType(Behavior b, DependencyObject o) =>
o != null && b.AssociatedType.IsInstanceOfType(o); Try / catch
try { behavior.Attach(target); }
catch (InvalidOperationException ex) when (ex.Message.Contains("TypeConstraintViolated")) {
// log the type mismatch: behavior type vs target type
} Prevention
- Check AssociatedType before attaching programmatically.
- Verify element types in XAML against AssociatedTypeAttribute on the behavior.
- After library upgrades, re-check any narrowed type constraints.
- Prefer generic behaviors so the compiler enforces the element type.
When it happens
Trigger: Calling behavior.Attach(obj) where obj is non-null and !AssociatedType.IsInstanceOfType(obj), e.g. attaching a behavior declared for TextBox onto a Button, directly or via BehaviorCollection.ItemAdded.
Common situations: Applying a strongly-typed behavior (e.g. one constrained to TextBoxBase) to the wrong control in XAML or code; AssociatedTypeAttribute narrowed in a library update while existing markup still uses the old element type; generic behaviors where the constraint was forgotten after a refactor.
Understand the failure class
Background: Type mismatch errors: IllegalArgumentException, TypeError and type guards across 150 open-source libraries — this error's family across 150 libraries.
Related errors
- ExceptionStringTable.RetargetedTypeConstraintViolatedExcepti…
- ExceptionStringTable.TypeConstraintViolatedExceptionMessage
- ExceptionStringTable.TypeConstraintViolatedExceptionMessage
- The element must be a DependencyObject
- ExceptionStringTable.DuplicateItemInCollectionExceptionMessa…
AI-assisted analysis of HandyOrg/HandyControl@2c0875ebd6 (2026-09-14).
Data as JSON: /api/errors/96261a68a9d20886.
Report an issue: GitHub.
Appendix: source
Thrown at src/Shared/System.Windows.Interactivity/Behavior.cs:44
protected Type AssociatedType
{
get
{
ReadPreamble();
return _associatedType;
}
}
public void Attach(DependencyObject dependencyObject)
{
if (!Equals(dependencyObject, AssociatedObject))
{
if (AssociatedObject != null)
throw new InvalidOperationException(ExceptionStringTable
.CannotHostBehaviorMultipleTimesExceptionMessage);
if (dependencyObject != null && !AssociatedType.IsInstanceOfType(dependencyObject))
throw new InvalidOperationException(string.Format(CultureInfo.CurrentCulture,
ExceptionStringTable.TypeConstraintViolatedExceptionMessage,
new object[] { GetType().Name, dependencyObject.GetType().Name, AssociatedType.Name }));
WritePreamble();
_associatedObject = dependencyObject;
WritePostscript();
OnAssociatedObjectChanged();
OnAttached();
}
}
public void Detach()
{
OnDetaching();
WritePreamble();
_associatedObject = null;
WritePostscript();
OnAssociatedObjectChanged();
}View on GitHub (pinned to 2c0875ebd6)