WPF StringFormat on Label Content
binding, wpf, wpf-controls, wpfdatagrid, wpftoolkit
Solution
The reason this doesn't work is that the `Label.Content` property is of type `Object`, and `Binding.StringFormat` is only used when binding to a property of type `String`.
What is happening is:
- The `Binding` is boxing your `MaxLevelOfInvestment` value and storing it the `Label.Content` property as a boxed decimal value.
- The Label control has a template that includes a `ContentPresenter`.
- Since `ContentTemplate` is not set, `ContentPresenter` looks for a `DataTemplate` defined for the `Decimal` type. When it finds none, it uses a default template.
- The default template used by the `ContentPresenter` presents strings by using the label's `ContentStringFormat` property.
Two solutions are possible:
- Use Label.ContentStringFormat instead of Binding.StringFormat, or
- Use a String property such as TextBlock.Text instead of Label.Content
Here is how to use Label.ContentStringFormat:
<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />
Here is how to use a TextBlock:
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />
Note: For simplicity I omitted one detail in the above explanation: The `ContentPresenter` actually uses its own `Template` and `StringFormat` properties, but during loading these are automatically template-bound to the `ContentTemplate` and `ContentStringFormat` properties of the `Label`, so it seems as if the `ContentPresenter` is actually using the `Label`'s properties.
Problem
I want to format my string binding as `Amount is X` where `X` is a property bound to a label. I've seen many examples but the following doesn't work: ``` <Label Content="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" /> ``` I've also tried these combinations: ``` StringFormat=Amount is {0} StringFormat='Amount is {}{0}' StringFormat='Amount is \{0\}' ``` I even tried changing the binding property's datatype to `int`, `string`and `double`. Nothing seems to work. This is a very common use case but doesn't seem to be supported.