2013-08-12 43 views
1

我需要根據存儲在數據庫中的貨幣值來顯示貨幣格式(EUR/USD/YEN等)的值顯示號碼。WPF數據綁定到在適當的貨幣

在數據庫中存儲數據,如:

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

在XAML中,我想知道我怎麼能以正確的貨幣格式顯示值。 例如,如果我從數據庫(ID = 1)讀出的第一行,我喜歡顯示它在UI 1000€但如果我讀取第二行(ID = 2),應該顯示爲$ 1500元。

現在我的XAML MVVM結合看起來像這樣:

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

...而這對我來說總是顯示爲$ 1,500價值,我不想要的。

+0

爲什麼不把字符串作爲返回SelectedItem格式的屬性,並且只是綁定到它?我總是發現在你的觀點中把這樣的邏輯有問題並且很難測試。 – JMK

回答

0

您正在使用的字符串格式是基於當前系統的語言環境,所以它不是很長的路要走的。在你的情況下,你會對這樣的轉換器感興趣:http://blogs.msdn.com/b/bencon/archive/2006/05/10/594886.aspx

傳入兩個值(貨幣和金額),返回一個字符串表示形式以顯示在UI上。

3

A轉換器類可以做的伎倆爲您實現所需的行爲

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]); 
     } 
    } 
} 

只需使用XAML中的轉換器與TextBlock綁定。

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

+1爲一個偉大的轉換器和伴隨的演練。讓它繼承MarkupExtension以提供coup de grace –

+1

@GarryVass:感謝您的有用建議。更新了答案,現在看起來更好。 :) – Nitesh