标签内容的字符串格式

我想将字符串绑定格式化为 Amount is X,其中 X是绑定到标签的属性。

我见过很多例子,但是下面的例子不起作用:

<Label Content="{Binding Path=MaxLevelofInvestment,
StringFormat='Amount is {0}'}" />

我也试过这些组合:

StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'

我甚至尝试将绑定属性的数据类型更改为 intstringdouble。好像都没用。这是一个非常常见的用例,但似乎不受支持。

83711 次浏览

Try using a converter....

<myconverters:MyConverter x:Key="MyConverter"/>




<Label Content="{Binding Path=MaxLevelofInvestment, Converter={StaticResource MyConverter"} />




public class MyConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return String.Format("Amount is {0}", value);
}


public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return value;
}
}

I just checked and for some reason it doesn't work with the Label, probably because it uses a ContentPresenter for the Content property internally. You can use a TextBlock instead and that will work. You could also put the TextBlock excerpt below in the content of a Label if you need to inherit styling, behaviour etc.

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />

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:

  • 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.

Make a universal StringFormatConverter : IValueConverter. Pass your format string as ConverterParameter.

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"

Also, make StringFormatMultiConverter : IMultiValueConverter when you need more than one object in format string, for instance, Completed {0} tasks out of {1}.

You can use this below

<Label Content="{Binding Content, StringFormat='Page Data> {0}'}" />

"Content" is a binding variable and between the single quotes type your text. {0} where the Content data will be inserted.