Nuts
Nuts

Reputation: 2813

WPF databinding to display number in an appropriate currency

I need to display a value in a currency format (EUR / USD / YEN etc.) depending on the currency value stored in the database.

In the database the data is stored like:

Id    Value   Currency
1     1000    EUR
2     1500    USD
3     9650    USD

In XAML, I'd like to know how I can show the value in a correct currency format. For example, if I read the first line from the database (Id=1), I like to show it on UI as €1,000 but if I read the second line (Id=2) it should be shown as $1,500.

Right now my XAML MVVM binding looks like this:

<TextBlock Text="{Binding SelectedItem, StringFormat=c0}" ...

...and for me this displays the value always as $1,500 which I do not want.

Upvotes: 1

Views: 1931

Answers (2)

Nitesh
Nitesh

Reputation: 7429

A converter class can do the trick for you to achieve the desired behavior

public class CurrencyConverter : MarkupExtension, IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
    {
        return GetCurrency(values);
    }

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


    public override object ProvideValue(IServiceProvider serviceProvider)
    {
        return this;
    }

    private string GetCurrency(object[] values)
    {
        switch (values[1].ToString())
        {
            case "USD":
                return string.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", values[0]);

            case "EUR":
                return string.Format(new System.Globalization.CultureInfo("en-GB"), "{0:C}", values[0]);

            default:
                return string.Format(new System.Globalization.CultureInfo("en-US"), "{0:C}", values[0]);
        }
    }
}

Simply use the converter in XAML with your TextBlock bindings.

<TextBlock DataContext="{Binding SelectedItem, ElementName=listBox}">
    <TextBlock.Text>
        <MultiBinding Converter="{local:CurrencyConverter}">
            <Binding Path="Value"/>
            <Binding Path="Currency"/>
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

Upvotes: 4

Yury Schkatula
Yury Schkatula

Reputation: 5369

The string format you're using is based on current system locale so it's not a way to go at all. In your situation you would be interested in something like such a converter: http://blogs.msdn.com/b/bencon/archive/2006/05/10/594886.aspx

Pass in two values (currency and amount), return back a string representation to be shown on UI.

Upvotes: 0

Related Questions