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


124

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

<TextBlock x:Name="textBlockTemperature">
        <Run Text="{Binding CelsiusTemp, Mode=OneWay}"/></TextBlock>

这对于显示实际温度值效果很好,但是我想格式化该值,因此它包括°C而不是数字(30°C而不是30)。我一直在阅读有关StringFormat的文章,并且看到了一些类似的通用示例:

// format the bound value as a currency
<TextBlock Text="{Binding Amount, StringFormat={}{0:C}}" />

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

不幸的是,在我尝试执行的过程中,我所见的所有示例均未将字符串附加到绑定值上。我敢肯定它一定很简单,但是我找不到运气。谁能告诉我该怎么做?

Answers:


217

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

<TextBlock Text="{Binding CelsiusTemp, StringFormat={}{0}°C}" />

20
为什么xaml中的字符串格式前导空{}
Jonesopolis

6
@Jonesopolis它在文档中-但是如果您的格式字符串以a开头{,则它提供了一种转义机制,因为{}在xaml中已经具有含义。
Reed Copsey

5
我看不到文档在何处说明前导{}。
埃里克

5
@Eric像许多文档一样,它很臭-他们演示了它,但不解释。
Reed Copsey

19

106

如果您将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>

6
我更喜欢此答案,因为我可以轻松地从字符串库中插入文本。当然,如果您真的担心国际化,那么使用转换器可能会更好,因此数字和单位的顺序不是固定的。<Run Text =“ {x:Static s:UIStrings.General_FahrenheitAbbreviation}” />
Matt Becker 2015年

1
这是一个很好的解决方案,但是在文本运行之间的最终文本显示中,我得到了额外的空格-为什么?在您的示例中,我看到0 °C ( 32 °F)
Conrad

如果您想进行实际的字符串格式化(即控制小数位数等),它并不是超级有用。
BrainSlugs83 2013年

5
@Conrad如果不想在每次运行之间留空格,则应将这些运行放在一行上,如下所示:<TextBlock> <Run Text =“ {Binding CelsiusTemp}” /> <Run Text =“°C” / > <Run Text =“(” /:<Run Text =“ {Binding Fahrenheit}” /> << Run Text =“°F)” /> </ TextBlock>
Ladislav Ondris

91

请注意,在绑定中使用StringFormat似乎仅适用于“文本”属性。将其用于Label.Content将不起作用


15
一个非常说了重要的一点,我想它,直到我变得绝望,发现此评论来验证我的怀疑。
DonBoitnott

64
ContentStringFormat进行救援,例如:Content="{Binding Path=TargetProjects.Count}" ContentStringFormat="Projects: {0}"
astrowalker

2
感谢真正的英雄Casper发布该信息。
DaWiseguy

5
对于GridViewColumn头,使用HeaderStringFormat="{}{0} For Report"
费利克斯

2
如果您使用的是设计时数据,则似乎需要在编辑ContentStringFormat之后重新生成项目,以使更改反映在设计器中,而用于文本框的StringFormat会实时更新设计器。
理查德·摩尔

-8

在xaml中

<TextBlock Text="{Binding CelsiusTemp}" />

在中ViewModel,通过这种方式设置值也可以:

 public string CelsiusTemp
        {
            get { return string.Format("{0}°C", _CelsiusTemp); }
            set
            {
                value = value.Replace("°C", "");
              _CelsiusTemp = value;
            }
        }

19
这与View-Viewmodel分离的整体观点背道而驰
Askolein '17
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.