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
Bindingis boxing yourMaxLevelOfInvestmentvalue and storing it theLabel.Contentproperty as a boxed decimal value. - The Label control has a template that includes a
ContentPresenter. - Since
ContentTemplateis not set,ContentPresenterlooks for aDataTemplatedefined for theDecimaltype. When it finds none, it uses a default template. - The default template used by the
ContentPresenterpresents strings by using the label’sContentStringFormatproperty.
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.