31

或者,更清楚地说,我如何格式化文本块(在我的情况下,要包含在工具提示中),以便文本的某些部分来自绑定值。

在普通的 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 中执行这种格式化?

4

5 回答 5

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 - 您无法绑定到它,但有一些解决方法:

于 2009-01-15T15:08:37.503 回答
11

我将拆分为多个文本块,将每个文本块与绑定中的 StringFormat={0:P} 绑定,如下所示:

<TextBox Text="{Binding Something, StringFormat=\{0:P\}}" />

有关示例,请参阅此帖子:Lester 在 StringFormat 上的 WPF 博客

Checkout VS2010 - 来自属性的绑定包括选项中的格式。

于 2010-02-09T15:45:06.323 回答
3

如果您使用的是 3.5 SP1,Aku 的答案就是要走的路。如果不是,您可以使用我的WPF 转换器库中的FormatConverter 。

于 2009-01-15T16:34:11.433 回答
2

据我所知,WPF 不会做你想做的事。您确实有一个更强大(尽管涉及更多)的解决方案。

看一下IValueConverter接口。

MSDN HowTo 链接在这里

编辑

根据 aku 的回答,以及您不能使用 3.5 SP1 的断言,这里有一个替代方案。

看看 Phil Haack 最近关于字符串格式化的系列文章:

创建一个 ValueConverter,因为它将格式作为属性。然后,您应该能够绑定您的数据对象并根据您定义的格式(使用属性名称而不是位置)对其进行格式化。

于 2009-01-15T15:08:15.493 回答
2

我过去解决这个问题的方法实际上是将列表中的 TextBlock 分解为几个 TextBlock。尝试这样的事情:

<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 函数。

于 2009-01-15T15:14:04.840 回答