What is the WPF XAML Data Binding equivalent of String.Format?

夙愿已清 提交于 2019-11-27 18:45:32

You can use MultiBinding + StringFormat (requires WPF 3.5 SP1):

<TextBox.Text>
    <MultiBinding StringFormat="{}{1:#0}% up, {2:#0}% down">
      <Binding Path="PercentageOne" />
      <Binding Path="PercentageTwo"/>
    </MultiBinding>
</TextBox.Text>

Regarding Run.Text - you can't bind to it but there are some workarounds:

I would split into multiple textblocks, binding each one with the StringFormat={0:P} in the binding as such:

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

See this post for examples:Lester's WPF Blog on StringFormat

Checkout VS2010 - The binding from properties includes formatting in the options.

Kent Boogaart

If you're using 3.5 SP1, Aku's answer is the way to go. If you're not, you can use the FormatConverter from my WPF Converters library.

The way I've solved this in the past is actually to break the TextBlock you have in your listing up into several TextBlocks. Try something like this:

<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>

Alternately you can create something like a StringFormatConverter, which could take the format string as a parameter, and use a MultiBinding to pass it the parameters. See this link for MultiBindings:

MultiBinding Info

And this one for info on converters:

Converters Info

You can pretty easily imagine a converter that takes "object[] values" instead of "object value" as it's first parameter, and passes those on to the Format function.

As far as I know, WPF doesn't do what you want. You do have a much more powerful (albeit more involved) solution.

Take a look at the IValueConverter interface.

MSDN HowTo link here

EDIT

Based on aku's answer, and your assertion that you can't use 3.5 SP1, here's an alternative.

Take a look at Phil Haack's recent series of posts on string formatting:

Create a ValueConverter as that takes the format as a property. You should then be able to bind your data object and have it format based on your defined format (using property name instead of position).

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!