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.

Original source

Related problems