标签内容上的WPF StringFormat

Eve*_*ers 69 wpf binding wpftoolkit wpf-controls wpfdatagrid

我想格式化我的字符串绑定,因为Amount is Xwhere X是绑定到标签的属性.

我见过很多例子,但以下内容不起作用:

<Label Content="{Binding Path=MaxLevelofInvestment, 
   StringFormat='Amount is {0}'}" />
Run Code Online (Sandbox Code Playgroud)

我也试过这些组合:

StringFormat=Amount is {0}
StringFormat='Amount is {}{0}'
StringFormat='Amount is \{0\}'
Run Code Online (Sandbox Code Playgroud)

我甚至尝试将绑定属性的数据类型更改为int,stringdouble.似乎没什么用.这是一个非常常见的用例,但似乎不受支持.

Ray*_*rns 179

这不起作用的原因是Label.Content属性是类型的Object,并且Binding.StringFormat仅在绑定到类型的属性时使用String.

发生的事情是:

  1. Binding是拳击的MaxLevelOfInvestment价值并将其存储的Label.Content属性作为盒装十进制值.
  2. Label控件有一个包含a的模板ContentPresenter.
  3. 由于ContentTemplate未设置,因此ContentPresenter查找为该类型DataTemplate定义的内容Decimal.当它找不到时,它使用默认模板.
  4. ContentPresenter使用标签ContentStringFormat属性的呈现字符串使用的默认模板.

有两种解决方案:

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

以下是如何使用Label.ContentStringFormat:

<Label Content="{Binding Path=MaxLevelofInvestment}" ContentStringFormat="Amount is {0}" />
Run Code Online (Sandbox Code Playgroud)

以下是如何使用TextBlock:

<TextBlock Text="{Binding Path=MaxLevelofInvestment, StringFormat='Amount is {0}'}" />
Run Code Online (Sandbox Code Playgroud)

注意:为了简单起见,我省略了上述解释一个细节:在ContentPresenter实际使用自己TemplateStringFormat属性,但加载过程中这些都是自动模板绑定到ContentTemplateContentStringFormat的特性Label,所以它看起来好像ContentPresenter是实际使用Label的性能.

  • 为了后代:如果您以“{0}”开头 ContentStringFormat,请不要忘记在其前面添加“{}”。因此将其设置为 `ContentStringFormat="{}{0} some text here"` (8认同)

小智 5

普及StringFormatConverter : IValueConverter。将格式字符串传递为ConverterParameter

Label Content="{Binding Amount, Converter={...myConverter}, ConverterParameter='Amount is {0}'"
Run Code Online (Sandbox Code Playgroud)

另外,StringFormatMultiConverter : IMultiValueConverter当您需要多个格式字符串中的对象时,请使用make Completed {0} tasks out of {1}