当前位置: 首页 > news >正文

【笔记】介绍 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封装的自定义控件资源库

http://www.dtcms.com/a/422752.html

相关文章:

  • 【XR行业应用】XR + 医疗:重构未来医疗服务的技术革命与实践探索
  • 微服务-Nacos 技术详解
  • 天津高端网站建设企业旅游品牌网站的建设
  • 51单片机-实现DAC(PWM)数模转换PWM控制呼吸灯、直流电机实验教程
  • VMware安装虚拟机并且部署 CentOS 7 指南
  • 响应网站先做电脑端网站更换空间后排名消失 首页被k
  • 怎么做跳转网站首页化妆品网站制作
  • 数据结构 排序(3)---交换排序
  • 告别内网困局:cpolar破解Websocket远程访问难题
  • LeetCode热题--207. 课程表--中等
  • 算法奇妙屋(四)-归并分治
  • 【嵌入式硬件实例】-晶体管放大器
  • ArcGIS数据迁移问题汇总(postgresql)
  • SQLyog:一款功能强大、简单易用的MySQL管理工具
  • Boost 搜索引擎
  • 紧跟大数据技术趋势:食物口味分析系统Spark SQL+HDFS最新架构实现
  • c2c网站的建设做企业网站有哪些好处
  • 从AI角度深入解析和论述哲学的终极答案‘语言即世界‘
  • 网站开发实训报告织梦手机网站建设
  • python做网站开发免费公司企业建站代理
  • 科技信息差(9.29)
  • ES如何基于Linux配置开机自启动
  • DeepSeek Java 单例模式详解
  • 单例模式入门
  • PMON failed to acquire latch 的报错及sqlplus / as sysdba 无法连接
  • Vibe Coding - MCP Feedback Enhanced(交互反馈 MCP)
  • Elasticsearch 搭建(亲测)
  • Java 设计模式在 Spring 框架中的实践:工厂模式与单例模式
  • 手机网站被禁止访问怎么打开网页软件应用大全
  • SQL注入与防御:从攻击原理到预编译防御