wpfwpf-controlsbindingwpftoolkitwpfdatagrid

WPF StringFormat on Label Content


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, stringand double. Nothing seems to work. This is a very common use case but doesn't seem to be supported.


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:

    1. The Binding is boxing your MaxLevelOfInvestment value and storing it the Label.Content property as a boxed decimal value.
    2. The Label control has a template that includes a ContentPresenter.
    3. Since ContentTemplate is not set, ContentPresenter looks for a DataTemplate defined for the Decimal type. When it finds none, it uses a default template.
    4. The default template used by the ContentPresenter presents strings by using the label's ContentStringFormat property.

    Two solutions are possible:

    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.