这不起作用的原因是
Label.Content
属性的类型为 Object
,并且 Binding.StringFormat
仅在绑定到 String
类型的属性时使用。
发生的事情是:
Binding
正在对您的 MaxLevelOfInvestment
值进行装箱并将其存储为 Label.Content
属性作为装箱的十进制值。ContentPresenter
的模板。ContentTemplate
,因此 ContentPresenter
会查找为 DataTemplate
类型定义的 Decimal
。当它找不到时,它会使用默认模板。ContentPresenter
使用的默认模板通过使用标签的 ContentStringFormat
属性来呈现字符串。有两种可能的解决方案:
这里是如何使用Label.ContentStringFormat:
<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />
以下是如何使用 TextBlock:
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />
注意:为了简单起见,我在上面的解释中省略了一个细节:
ContentPresenter
实际上使用了自己的Template
和StringFormat
属性,但在加载过程中,它们会自动模板绑定到ContentTemplate
和ContentStringFormat
属性Label
,所以看起来 ContentPresenter
实际上正在使用 Label
的属性。
制作一个通用的
StringFormatConverter : IValueConverter
。将格式字符串传递为 ConverterParameter
.
Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"
此外,当格式字符串中需要多个对象时,请使用
StringFormatMultiConverter : IMultiValueConverter
,例如 Completed {0} tasks out of {1}
。
我刚刚检查过,由于某种原因它不适用于
Label
,可能是因为它在内部使用 ContentPresenter
来表示 Content
属性。您可以使用 TextBlock
来代替,这样就可以了。如果您需要继承样式、行为等,您也可以将下面的 TextBlock
摘录放在 Label
的内容中。
<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is \{0\}'} />
尝试使用转换器......
<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;
}
}