标签内容上的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更改为int
, string
和double
。 似乎没有任何工作。 这是一个非常常见的用例,但似乎没有被支持。
这不起作用的原因是Label.Content
属性的types为Object
, Binding.StringFormat
仅在绑定到String
types的属性时才使用。
发生什么事是:
-
Binding
是装箱你的Label.Content
值和存储它的Label.Content
属性作为盒装十进制值。 - Label控件有一个包含
ContentPresenter
的模板。 - 由于未设置
ContentTemplate
,因此ContentPresenter
查找为Decimal
types定义的DataTemplate
。 如果找不到,则使用默认模板。 -
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
实际上使用了它自己的Template
和StringFormat
属性,但是在加载期间,这些会自动模板绑定到Label
的ContentTemplate
和ContentStringFormat
属性,所以好像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代码