DeMama
DeMama

Reputation: 1202

Binding Source vs x:Static

in WPF one can bind to static properties. Now I know 2 ways of doing this:

Content="{x:Static stat:Statics.CurrentUser}"

Or:

Content="{Binding Source={x:Static stat:Statics.CurrentUser}}"

Are there any differences between these 2 methods?

Upvotes: 5

Views: 2523

Answers (1)

dkozl
dkozl

Reputation: 33364

Main difference in this case is that x:Static does not perform additional conversion

From x:Static Markup Extension

Use caution when you make x:Static references that are not directly the type of a property's value. In the XAML processing sequence, provided values from a markup extension do not invoke additional value conversion. This is true even if your x:Static reference creates a text string, and a value conversion for attribute values based on text string typically occurs either for that specific member or for any member values of the return type.

So lets say you do

<TextBlock Text="{x:Static SystemColors.ActiveBorderBrush}"/>

this will cause runtime error:

'#FFB4B4B4' is not a valid value for property 'Text'.

because SolidColorBrush is not String whilst

<TextBlock Text="{Binding Source={x:Static SystemColors.ActiveBorderBrush}}"/>

will work fine and display #FFB4B4B4 because it will perform ToString() conversion. Also without Binding you are not able to access instance properties of static object so for example you would not be able to get Color property of that brush

<TextBlock Text="{Binding Source={x:Static SystemColors.ActiveBorderBrush}, Path=Color}"/>

Upvotes: 6

Related Questions