Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Binding StringFormat

I have a collection of textblocks that I'm going to be showing and I'm needing the text of each textblock to be displayed differently. I'm currently saving the format string in the tag property and I'm needing to display the text in this format. How do I bind the StringFormat section?

Something like the section below:

<TextBlock Tag="{Binding MyFormatString}" Text="{Binding MyProperty, StringFormat='{}{0:MyTag}'}" />

like image 454
Miles Avatar asked Oct 24 '10 22:10

Miles


People also ask

How do I format a string in XAML?

Notice that the formatting string is delimited by single-quote (apostrophe) characters to help the XAML parser avoid treating the curly braces as another XAML markup extension. Otherwise, that string without the single-quote character is the same string you'd use to display a floating-point value in a call to String.

What is WPF Multibinding?

Multibinding takes multiple values and combines them into another value. There are two ways to do multibinding, either using StringFormat or by a converter. The StringFormat is simple compared to a converter, so we will start with that first.


1 Answers

Since BindingBase.StringFormat is not a dependency property, I do not think that you can bind it. If the formatting string varies, I'm afraid you will have to resort to something like this

<TextBlock Text="{Binding MyFormattedProperty}" />

and do the formatting in your view model. Alternatively, you could use a MultiBinding and a converter (example code untested):

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource myStringFormatter}">
            <Binding Path="MyProperty" />
            <Binding Path="MyFormatString" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

public class StringFormatter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return string.Format((string)values[1], values[0]);
    }
    ...
}
like image 56
Heinzi Avatar answered Sep 22 '22 06:09

Heinzi