或者,更清楚的是,我如何格式化一个文本块(在我的情况下,包含在工具提示中),以便文本的某些部分来自绑定值。
在普通的C#中我会使用:
_toolTip.Text = string.Format("{1:#0}% up, {2:#0}% down",
Environment.NewLine, percentageOne, percentage2);
然而,Text属性的WPF XAML标记似乎只能包含一个绑定。花括号给了我很大的希望,但这是不可能的:
<Element>
<Element.Tooltip>
<!-- This won't compile -->
<TextBlock Text="{Binding Path=PercentageOne}% up, {Binding Path=PercentageTwo}% down"/>
</Element.Tooltip>
</Element>
我读到Run.Text
属性不是依赖属性,因此不能绑定。
我有可能在XAML中执行此格式化吗?
答案 0 :(得分:45)
您可以使用MultiBinding + StringFormat(需要WPF 3.5 SP1):
<TextBox.Text>
<MultiBinding StringFormat="{}{1:#0}% up, {2:#0}% down">
<Binding Path="PercentageOne" />
<Binding Path="PercentageTwo"/>
</MultiBinding>
</TextBox.Text>
关于Run.Text - 您无法绑定它,但有一些解决方法:
答案 1 :(得分:11)
我会分成多个文本块,在绑定中用StringFormat = {0:P}绑定每个文本块:
<TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />
请参阅此帖子以获取示例:Lester's WPF Blog on StringFormat
Checkout VS2010 - 来自属性的绑定包括选项中的格式。
答案 2 :(得分:3)
如果您使用的是3.5 SP1,那么Aku的答案是可行的。如果不是,您可以使用我的FormatConverter库中的WPF Converters。
答案 3 :(得分:2)
据我所知,WPF没有做你想做的事。你确实有一个更强大的(虽然更多参与)解决方案。
查看IValueConverter界面。
MSDN如何链接here
修改强>
基于aku的回答,以及您无法使用3.5 SP1的断言,这是另一种选择。
看看Phil Haack最近关于字符串格式的一系列帖子:
创建ValueConverter,因为它将格式作为属性。然后,您应该能够绑定数据对象并根据您定义的格式进行格式化(使用属性名称而不是位置)。
答案 4 :(得分:2)
我过去解决这个问题的方法实际上是将您列表中的TextBlock分解为几个TextBlocks。尝试这样的事情:
<Element>
<Element.Tooltip>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding Path=PercentageOne}"/>
<TextBlock Text="% up, "/>
<TextBlock Text="{Binding Path=PercentageTwo}"/>
<TextBlock Text="% down"/>
</StackPanel>
</Element.Tooltip>
</Element>
或者,您可以创建类似StringFormatConverter的东西,它可以将格式字符串作为参数,并使用MultiBinding将参数传递给它。请参阅此链接了解MultiBindings:
这是关于转换器的信息:
您可以很容易地想象一个转换器将“object [] values”而不是“object value”作为它的第一个参数,并将它们传递给Format函数。