如何在WPF XAML中使用多绑定中的字符串格式化?

18

如您所知,StringFormat在WPF数据表示中非常重要。我的问题是,在WPF多绑定时如何使用StringFormat?

如果我举出一个非常简单的例子:

我们有变量A和B,它们的值分别为10.255555和25.6999999。

我们想要显示它们10.2,25.6怎么办?如何在多绑定时实现这一点?通常使用ValueConverter可以轻松解决此问题。

对于这个话题的任何帮助和想法都将不胜感激。

3个回答

61

只需在MultiBinding上设置StringFormat属性;对于多重绑定中的每个绑定,使用占位符({0}、{1}等)并根据需要包含格式说明符(例如,F1表示带有1个小数位的十进制数)

<TextBlock>
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:F1}{1:F1}">
            <Binding Path="A" />
            <Binding Path="B" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

开头的{}是格式字符串中的转义序列(否则XAML解析器会将{视为标记扩展的开始)


谢谢您的快速回复,但是您能否在回答中简要解释一下吗? - ibrahimyilmaz
@ibrahimyilmaz,抱歉,我以为代码已经很清楚了...我添加了一个简短的解释。 - Thomas Levesque
1
嗯,我一直以为<MultiBinding/>需要一个转换器。实际上,当我尝试像上面那样设置多绑定时,在运行时会出现“无法设置MultiBinding,因为必须指定MultiValueConverter”的错误提示。那么...如何才能让这个答案起作用呢? - Peter Duniho
哦,这正是我需要的。绑定中的StringFormat完全被忽略了。我感到非常沮丧。 - zORg Alex

9

如果有人在寻找“时间格式”,这是关于24小时制的,这也是我来到这篇文章的原因:

<TextBlock TextAlignment="Center">
    <TextBlock.Text>
        <MultiBinding StringFormat="{}{0:HH:mm} - {1:HH:mm}">
             <Binding Path="StartTime" />
             <Binding Path="EndTime" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

前导的0:和1:是对绑定的引用。

[0:hh:mm tt]用于显示上午/下午。


6
为了简化,您可以使用两个TextBlock/Label来显示这些值。
如果您正在使用.Net4,您可以在TextBlock的Run Inline元素中进行绑定。
<TextBlock>
    <Run Text="{Binding A, StringFormat={}{0:F1}}"/>
    <Run Text="{Binding B, StringFormat={}{0:F1}}"/>
</TextBlock>

在两个“Run”之间将会有一个空格。这不像上面提到的StringFormat="{}{0:F1}{1:F1}"。即使写成<Run /><Run /><Run />,只有在您不格式化XAML(如ReSharper所做的那样)并且最终处于<Run />[CRLF]<Run />[CRLF]<Run />时才会成功。 - Marcel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接