dotnet/maui · error · XamlParseException
Expected {nameof(Setter)} but found {parents[4]}.
Error message
Expected {nameof(Setter)} but found {parents[4]}. What it means
XamlParseException raised in FindTypeForVisualState when, in the Style-attached visual-state path, parents[4] is not a Setter. After confirming VisualStateGroupList at parents[3], the converter expects the value context to ultimately be rooted in a Setter; finding something else means the Setter.Property resolution cannot infer the target type from the chain.
Source
Thrown at src/Controls/src/Core/BindablePropertyConverter.cs:149
// Skip 0; we would not be making this check if TargetObject were not a Setter
// Skip 1; we would not be making this check if the immediate parent were not a VisualState
// VisualStates must be in a VisualStateGroup
if (parents[2] is not VisualStateGroup)
throw new XamlParseException($"Expected {nameof(VisualStateGroup)} but found {parents[2]}.", lineInfo);
// Are these Visual States directly on a VisualElement?
if (parents[3] is VisualElement vsTarget)
return vsTarget.GetType();
if (parents[3] is not VisualStateGroupList)
throw new XamlParseException($"Expected {nameof(VisualStateGroupList)} but found {parents[3]}.", lineInfo);
if (parents[4] is VisualElement veTarget)
return veTarget.GetType();
if (parents[4] is not Setter)
throw new XamlParseException($"Expected {nameof(Setter)} but found {parents[4]}.", lineInfo);
if (parents[5] is TriggerBase trigger)
return trigger.TargetType;
// These must be part of a Style; verify that
if (parents[5] is Style style)
return style.TargetType;
throw new XamlParseException($"Unable to find a TragetType for the Bindable Property. Try prefixing it with the TargetType.", lineInfo);
}
public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType)
{
if (value is not BindableProperty bp)
throw new NotSupportedException();
return $"{bp.DeclaringType.Name}.{bp.PropertyName}";
}View on GitHub (pinned to f377ff1c5e)
Solutions
- Ensure each Setter sits directly in the Setters collection and the Property attribute is on the Setter.
- Re-create the VisualState/Setter markup from a known-good template.
- Validate the Style/Setters/VisualStateManager nesting against the docs.
Example fix
<!-- before: Setter placed where converter expects a different node -->
<VisualStateGroupList>
<VisualStateGroup>
<VisualState>
<VisualState.Setters>
<!-- mis-nested nodes -->
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList>
<!-- after -->
<VisualStateGroupList>
<VisualStateGroup>
<VisualState x:Name="N">
<VisualState.Setters>
<Setter Property="VisualElement.BackgroundColor" Value="Red" />
</VisualState.Setters>
</VisualState>
</VisualStateGroup>
</VisualStateGroupList> Defensive patterns
Strategy: validation
Validate before calling
// Keep Setter as the direct parent of the resolved Property attribute within // VisualState.Setters.
Try / catch
try { /* compile */ }
catch (XamlParseException ex) when (ex.Message.Contains("Setter"))
{
// verify Setter placement in the visual-state chain
} Prevention
- Place Setters inside VisualState.Setters only.
- Avoid interleaving non-Setter nodes in the chain.
When it happens
Trigger: A VisualState nested in a Style's VisualStateGroupList where the immediate parent of the property reference is not a Setter; malformed Setters collection that places a Setter in the wrong slot; a Setter whose Property is being resolved outside its expected position.
Common situations: Editing Style/Setters XAML by hand and displacing a Setter; tool output that interleaves Setters with other nodes incorrectly.
Related errors
- Expected {nameof(VisualStateGroup)} but found {parents[2]}.
- Expected {nameof(VisualStateGroupList)} but found {parents[3
- Can't resolve {0}
- Unable to find a TragetType for the Bindable Property. Try p
- Can't resolve {parts[0]}
AI-assisted analysis of dotnet/maui@f377ff1c5e (2026-08-13).
Data as JSON: /api/errors/32c48abfb75a6668.
Report an issue: GitHub.