4

Is it possible to bind Text and StringFormat too?

<TextBlock Text="{Binding Path=Price, StringFormat={Binding Path=DecimalPoints}}" />

DecimalPoints is constantly changing from F0 to F15. Unfortunatelly the code above doesn't compile.

1
  • 1
    No, but you could probably do this using a converter Commented Aug 29, 2013 at 16:02

3 Answers 3

7

I think your best bet is definitely a converter. Then your binding would look like this:

<TextBlock.Text>
   <MultiBinding Converter="{StaticResource StringFormatConverter }">
      <Binding Path="Price"/>
      <Binding Path="DecimalPoints"/>
   </MultiBinding>
</TextBlock.Text>

Then a quick converter (you can certainly make it nicer, but this is the general idea).

    public class StringFormatConverter : IMultiValueConverter
    {
      #region IMultiValueConverter Members

      public object Convert(object[] values, Type targetType, object parameter, System.Globalization.CultureInfo culture)
      {
          double number = (double)values[0];
          string format = "f" + ((int)values[1]).ToString();
          return number.ToString(format);
      }

      public object[] ConvertBack(object value, Type[] targetTypes, object parameter, System.Globalization.CultureInfo culture)
      {
        throw new NotImplementedException();
      }

      #endregion
    }
Sign up to request clarification or add additional context in comments.

3 Comments

Works perfect, Thanks. What you mean "make it nicer"?
Well, for instance I am assuming that the values being passed are a double and an int. Also I am assuming that there are two values passed (instead of say - only one). You could make the method a little more foolproof by checking the arguments first.
@Liz, could you check for my question please: stackoverflow.com/questions/40134370/…
5

As mentioned @Sheridan, in this case, Binding will not work. But you can create a class with static strings, and refer to them in XAML. The syntax is:

<x:Static Member="prefix : typeName . staticMemberName" .../>

Below is an example:

XAML

xmlns:local="clr-namespace:YourNameSpace"
xmlns:sys="clr-namespace:System;assembly=mscorlib"

<Grid>
    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat={x:Static Member=local:StringFormats.DateFormat}}" 
               HorizontalAlignment="Right" />

    <TextBlock Text="{Binding Source={x:Static sys:DateTime.Now}, StringFormat={x:Static Member=local:StringFormats.Time}}" />
</Grid>

Code behind

public class StringFormats 
{
    public static string DateFormat = "Date: {0:dddd}";

    public static string Time = "Time: {0:HH:mm}";
}   

For more information, please see:

x:Static Markup Extension on MSDN

Comments

3

No you can't... the reason is because you can only bind to a DependencyProperty of a DependencyObject and the StringFormat property of the Binding class is just a string.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.