Custom MarkupExtension && Nested Extensions == Bug
I’m currently working on a custom markup extension and came over a pretty nasty issue. Here’s the working XAML of a dummy extension:
<TextBox Name="txtCity" Foreground="{local:ColorExtension Color=Red}" />
This works like a charm – the fore color is set to red as expected. However – as soon as I try to set the Color property through a resource, I’m getting a compiler error:
<TextBox Name="txtCity" Foreground="{local:ColorExtension Color={StaticResource ErrorBrush}}" />
Here’s the error message: Unknown property ‘Color’ for type ‘MS.Internal.Markup.MarkupExtensionParser+UnknownMarkupExtension’ encountered while parsing a Markup Extension.
Well, the property does exist. Fortunately, Beatriz Costa referred to this bug in her blog – in October 2006. I’m working here with VS2008, targeting .NET 3.5, so I can honestly say: I’m not amused. Fortunately, there’s a workaround: Skip attribute syntax and fall back to property element syntax:
<TextBox Name="txtCity"> <TextBox.Foreground> <local:ColorExtension Color="{StaticResource ErrorBrush}" /> </TextBox.Foreground> </TextBox>
Another solution would be to assign a constructor to the ColorExtension markup extension that takes the Brush as a parameter. In that case, you could write XAML like this:
<TextBox Name="txtCity" Foreground="{local:ColorExtension {StaticResource ErrorBrush}}" />
The compiler accepts a StaticResource as a constructor parameter, but it appears it breaks the VS designer. So for now, it’s property element syntax.
Some other observations: Some extensions can be nested, others can’t. Using DynamicResource also fails to compile, while using a RelativeSource statement or something like {x:Null} works without complaints.
If somebody can shed some light on this, I’ll be happy to update this post accordingly 🙂