【笔记】介绍 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 对齐。
五、文档链接
- BindingBase.StringFormat | Microsoft Learn
- .NET 复合格式字符串(string.Format)| Microsoft Learn
- 标准数值格式字符串 | Microsoft Learn
- 自定义数值格式字符串 | Microsoft Learn
- 标准日期和时间格式字符串 | Microsoft Learn
- 自定义日期和时间格式字符串 | Microsoft Learn
- MultiBinding | Microsoft Learn
- PriorityBinding | Microsoft Learn
- FrameworkElement.Language | Microsoft Learn
- ContentPresenter.ContentStringFormat | Microsoft Learn
了解更多
System.Windows.Controls 命名空间 | Microsoft Learn
控件库 - WPF .NET Framework | Microsoft Learn
WPF 介绍 | Microsoft Learn
使用 Visual Studio 创建新应用教程 - WPF .NET | Microsoft Learn
https://github.com/HeBianGu
HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频
GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库
GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库