笔记介绍-WPF-XAML-中-Binding-的-StringFormat详细功能
目录
【笔记】介绍 WPF XAML 中 Binding 的 StringFormat详细功能
下面系统介绍 WPF XAML 中 Binding 的 StringFormat(含 {} 转义与 {0:F} 等),覆盖概念、写法大全。
一、核心概念
- 作用:在绑定值最终写入目标属性前,按 .NET 复合格式字符串进行格式化(等同 string.Format)。
- 生效范围:Binding、MultiBinding、PriorityBinding(它们的基类 BindingBase 提供 StringFormat)。
- 文化影响:使用目标元素的 Language(CultureInfo),常见为 zh-CN/en-US;也可通过 ConverterCulture 覆盖。
- 与 Fallback/TargetNull/Converter 的关系(顺序要点)
- 绑定失败时用 FallbackValue。
- 源值为 null/DBNull 时用 TargetNullValue。
- 之后应用 Converter(若有)。
- 最后应用 StringFormat 生成字符串。
二、写法大全(最常用形态)
- 仅格式(以 { 开头)需转义前缀 {}:
- Text=“{Binding Amount, StringFormat={}{0:C2}}”
- 有前后缀文字时可不加 {}:
- Text=“{Binding Amount, StringFormat=合计:{0:N2} 元}”
- 标准数值格式:C/N/F/P/D/X/E/G/R,如 {0:F}, {0:N2}, {0:C2}, {0:P1}, {0:D5}, {0:X}
- 自定义数值格式:{0:#,0.00}、{0:0.###}
- 日期时间格式(标准/自定义):{0:d}、{0:D}、{0:yyyy-MM-dd HH:mm:ss}
- 多值拼接(MultiBinding):StringFormat=“纬度:{0:F4},经度:{1:F4}”
- 优先级绑定(PriorityBinding):StringFormat=“显示名:{0}”
- 显示字面花括号:使用双花括号转义:StringFormat=“{{{0}}}” → 输出形如 {123}
- 内容类控件统一格式:ContentStringFormat=“{}{0:N2}”
三、使用方式(Active Document)
- 演示:数字、货币、百分比、日期、字面花括号、MultiBinding、PriorityBinding、ContentStringFormat、文化影响(Language)等
<UserControl x:Class="H.Test.DataGrid.UserControl1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:sys="clr-namespace:System;assembly=mscorlib"
Language="zh-CN">
<UserControl.DataContext>
<StackPanel>
<!-- 简单示例的数据源 -->
<TextBlock x:Name="Dummy"/>
</StackPanel>
</UserControl.DataContext>
<StackPanel Margin="12" Orientation="Vertical" Spacing="6">
<!-- 1) 纯格式(以 { 开头,须 {} 转义)-->
<TextBlock Text="{Binding Amount, StringFormat={}{0:F2}}"/>
<!-- 2) 含前后缀文字(无需 {})-->
<TextBlock Text="{Binding Amount, StringFormat=合计:{0:N2} 元}"/>
<!-- 3) 货币/百分比/整数/十六进制 -->
<TextBlock Text="{Binding Amount, StringFormat=货币:{0:C2}}"/>
<TextBlock Text="{Binding Ratio, StringFormat=进度:{0:P1}}"/>
<TextBlock Text="{Binding Count, StringFormat=编号:{0:D5}}"/>
<TextBlock Text="{Binding HexNum, StringFormat=十六进制:0x{0:X}}"/>
<!-- 4) 日期时间:标准与自定义 -->
<TextBlock Text="{Binding When, StringFormat=日期(短):{0:d}}"/>
<TextBlock Text="{Binding When, StringFormat=完整时间:{0:yyyy-MM-dd HH:mm:ss}}"/>
<!-- 5) 字面花括号(使用双花括号)-->
<TextBlock Text="{Binding Count, StringFormat=包裹花括号:{{{0}}}}"/>
<!-- 6) MultiBinding 拼接多个源 -->
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="位置:纬度 {0:F4},经度 {1:F4}">
<Binding Path="Latitude"/>
<Binding Path="Longitude"/>
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<!-- 7) PriorityBinding:取第一个可用值后再格式化 -->
<TextBlock>
<TextBlock.Text>
<PriorityBinding StringFormat="显示名:{0}" FallbackValue="无">
<Binding Path="DisplayName"/>
<Binding Path="UserName"/>
<Binding Path="Id"/>
</PriorityBinding>
</TextBlock.Text>
</TextBlock>
<!-- 8) ContentStringFormat:对 Content 统一格式化 -->
<Button Content="{Binding Amount}" ContentStringFormat="{}{0:N2}"/>
<!-- 9) 文化影响:切换为 en-US 观察小数点/千分位/货币符号 -->
<Border xml:lang="en-US" Margin="0,8,0,0" Padding="4" BorderBrush="#DDD" BorderThickness="1">
<StackPanel>
<TextBlock Text="{Binding Amount, StringFormat=Currency (en-US):{0:C2}}"/>
<TextBlock Text="{Binding When, StringFormat=Date (en-US):{0:D}}"/>
</StackPanel>
</Border>
<!-- 10) TargetNull/Fallback 与 StringFormat 的关系 -->
<!-- 源为 null → 先用 TargetNullValue,再不会走 {0:} 格式 -->
<TextBlock Text="{Binding NullableText, TargetNullValue=(空值), StringFormat=值:{0}}"/>
<!-- 绑定失败 → 用 FallbackValue -->
<TextBlock Text="{Binding NotExists, FallbackValue=(绑定失败), StringFormat=值:{0}}"/>
</StackPanel>
</UserControl>
四、易错与建议
- 以 “{” 开头时必须在 StringFormat 前缀加 “{}” 才能当作字面量(否则当作标记扩展解析)。
- 需要输出字面花括号用 “{{” 与 “}}”。
- StringFormat 受元素 Language 影响;跨文化格式化优先用 xml:lang 或设置元素 Language。
- 与 TargetNullValue/FallbackValue 并用时:遇 null/失败会先替换值,通常不再参与 {0:} 格式化。
- 若绑定目标属性不是 string,应用 StringFormat 后会生成字符串再尝试类型转换;确保目标属性可接受字符串或就是 Text/Content 等字符串目标。
- MultiBinding 的 StringFormat 采用 0、1、2… 索引;数量需与内部 Binding 对齐。
五、文档链接