使用StringFormat将字符串添加到WPF XAML绑定

bmt*_*033 114 c# data-binding wpf xaml string-formatting

我有一个WPF 4应用程序,其中包含一个TextBlock,它具有一个单向绑定到一个整数值(在这种情况下,温度为摄氏度).XAML看起来像这样:

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>
Run Code Online (Sandbox Code Playgroud)

这适用于显示实际温度值,但我想格式化这个值,因此它包括°C而不是数字(30°C而不是30°).我一直在阅读有关StringFormat的文章,我看过几个这样的通用例子:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />
Run Code Online (Sandbox Code Playgroud)

// preface the bound value with a string and format it as a currency
<TextBlock Text="{Binding Amount, StringFormat=Amount: {0:C}}"/>
Run Code Online (Sandbox Code Playgroud)

不幸的是,我所看到的所有例子都没有在我试图做的事情中附加一个字符串到绑定值.我敢肯定它必须简单但我找不到任何运气.任何人都可以向我解释如何做到这一点?

Ree*_*sey 198

您的第一个例子实际上是您所需要的:

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />
Run Code Online (Sandbox Code Playgroud)

  • 这里是神秘的{}的文档:https://msdn.microsoft.com/en-us/library/ms744986.aspx (16认同)
  • 为什么xaml中的字符串格式具有前导空``}? (14认同)
  • 我没有看到文档解释领先{}的位置. (5认同)
  • @Jonesopolis它在文档中 - 但如果你的格式字符串以`{`开头,它提供了一种逃避机制,因为`{}`已经在xaml中有意义. (4认同)
  • @Eric https://msdn.microsoft.com/en-us/library/system.windows.data.bindingbase.stringformat%28v=vs.110%29.aspx?f=255&amp;MSPPError=-2147217396 (3认同)
  • @Eric喜欢很多文档,它很臭 - 他们演示它,但不解释. (2认同)

den*_*zov 98

如果你在字符串的中间或多个绑定中有Binding,那么这是一个很好的可读性的替代方法:

<TextBlock>
  <Run Text="Temperature is "/>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>  
</TextBlock>

<!-- displays: 0°C (32°F)-->
<TextBlock>
  <Run Text="{Binding CelsiusTemp}"/>
  <Run Text="°C"/>
  <Run Text=" ("/>
  <Run Text="{Binding Fahrenheit}"/>
  <Run Text="°F)"/>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)

  • 我更喜欢这个答案,因为我可以轻松地从字符串库中插入文本.当然,如果您真的担心国际化,那么使用转换器可能会更好,因此数量和单位的顺序并不固定.<Run Text ="{x:Static s:UIStrings.General_FahrenheitAbbreviation}"/> (4认同)
  • @Conrad如果你不想在每次运行之间有空格,你应该将这些运行放在一行上,如下所示:<TextBlock> <Run Text ="{Binding CelsiusTemp}"/> <Run Text ="°C"/ > <Run Text ="("/:<Run Text ="{Binding Fahrenheit}"/> <Run Text ="°F)"/> </ TextBlock> (3认同)
  • 这是一个很好的解决方案,但我在文本运行之间的最终文本显示中获得了额外的空间 - 知道为什么吗?在您的示例中,我看到 ``0 °C ( 32 °F)`` (2认同)

小智 80

请注意,在Bindings中使用StringFormat似乎只适用于"text"属性.将它用于Label.Content将不起作用

  • `ContentStringFormat`来救援,例如:`Content ="{Binding Path = TargetProjects.Count}"ContentStringFormat ="Projects:{0}"`. (53认同)
  • 一个**非常重要的一点,它让我尝试它,直到我绝望,并发现此评论来证实我的怀疑. (11认同)
  • 对于GridViewColumn标头,使用`HeaderStringFormat ="{} {0} For Report"` (4认同)
  • 感谢 Casper,真正的英雄发布了这些信息。 (2认同)
  • 如果您正在使用设计时数据,似乎您需要在编辑 ContentStringFormat 后重建项目以获取更改以反映在设计器中,而 StringFormat 用于说文本框将实时更新设计器。 (2认同)