目录

笔记介绍-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 对齐。

五、文档链接

了解更多