标签内容上的WPF StringFormat

我想格式化我的string绑定作为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\}' 

我甚至尝试将绑定属性的数据types更改为intstringdouble 。 似乎没有任何工作。 这是一个非常常见的用例,但似乎没有被支持。

这不起作用的原因是Label.Content属性的types为ObjectBinding.StringFormat仅在绑定到Stringtypes的属性时才使用。

发生什么事是:

  1. Binding是装箱你的Label.Content值和存储它的Label.Content属性作为盒装十进制值。
  2. Label控件有一个包含ContentPresenter的模板。
  3. 由于未设置ContentTemplate ,因此ContentPresenter查找为Decimaltypes定义的DataTemplate 。 如果找不到,则使用默认模板。
  4. ContentPresenter使用的默认模板通过使用标签的ContentStringFormat属性呈现string。

两种解决scheme是可能的

  • 使用Label.ContentStringFormat而不是Binding.StringFormat或
  • 使用诸如TextBlock.Text而不是Label.Content的String属性

这里是如何使用Label.ContentStringFormat:

 <Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" /> 

以下是如何使用TextBlock:

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

注意:为了简单起见,我在上面的说明中省略了一个细节: ContentPresenter实际上使用了它自己的TemplateStringFormat属性,但是在加载期间,这些会自动模板绑定到LabelContentTemplateContentStringFormat属性,所以好像ContentPresenter实际上是使用Label的属性。

我只是检查,由于某种原因,它不适用于标签,可能是因为它在内部使用ContentPresenter的内容属性。 你可以使用一个TextBlock来代替,这将工作。 如果您需要inheritance样式,行为等,还可以将TextBlock摘录放在Label的内容中。

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

制作一个通用的StringFormatConverter : IValueConverter 。 将您的格式string作为ConverterParameter传递。

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

此外,如果您需要多个格式string中的对象(例如Completed {0} tasks out of {1} ,请使用StringFormatMultiConverter : IMultiValueConverter

尝试使用转换器….

 <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; } } 

也许这会帮助…

在XAML中embedded代码