XAML中的文化意识货币格式

时间:2016-04-28 15:47:58

标签: c# wpf xaml localization telerik

我想格式化绑定到数据网格中的单元格/列的货币值。

相关的XAML如下:

<telerik:RadGridView Grid.Row="0" Grid.ColumnSpan="2" x:Name="dataGrid" 
    AutoGenerateColumns="False" HorizontalAlignment="Stretch" 
    VerticalAlignment="Top" Margin="0,25,0,0" IsSearchingDeferred="True" 
    IsReadOnly="True" IsLocalizationLanguageRespected="False">
    <telerik:RadGridView.Columns>
        <telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}" 
            Header="{x:Static properties:Resources.AddressLine3}"/>
    </telerik:RadGridView.Columns>
</telerik:RadGridView>  

这是当前绑定到列的值(该值来自数据库的数字文字):

12345678.90

这是将文化设置为en-US

时输出的值
12345678.90 //notice the decimal point

这是将文化设置为nl-NL

时输出的值
12345678,90 //notice the comma

您可以看到文化在某种程度上受到尊重。但是,输出并不是我所期望的。

对于en-US文化,我希望输出为$12,345,678.90。对于nl-NL文化,我希望输出为€ 12.345.680,00

在我的XAML代码中,使用以下代码手动设置文化(用于测试目的):

public MainWindow()
{
    //I am toggling between the following cultures
    CultureInfo ci = new CultureInfo("nl-NL");
    //CultureInfo ci = new CultureInfo("ja-JP");
    //CultureInfo ci = new CultureInfo("en-US");

    //I am forcing the UI to use the culture I specify
    Thread.CurrentThread.CurrentCulture = ci;
    Thread.CurrentThread.CurrentUICulture = ci;
    this.Language = XmlLanguage.GetLanguage(ci.Name);
    Properties.Resources.Culture = ci;

    //these are used to test that to string formatting works as expected
    //when using the debugger
    float price = 12345678.90F;
    string currencyToDisplay = price.ToString("C");

    InitializeComponent();
}

问题

为什么不显示货币符号和数字分隔符的格式,即使我已将格式指定为货币?

手动,在后面的代码中格式化相同的数字给了我想要的结果,但我想在XAML中这样做。

我尝试了什么 我尝试了以下变通方法无济于事:

<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=C}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat={}{0:C}}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=\{0:C\}}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat='C'}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding Path=VALUATION, StringFormat=c}" Header="{x:Static properties:Resources.AddressLine3}"/>
<telerik:GridViewDataColumn DataMemberBinding="{Binding VALUATION}" DataFormatString="{}{0:C}" Header="{x:Static properties:Resources.AddressLine3}"/>

我有什么遗失的吗?

1 个答案:

答案 0 :(得分:2)

正如我们在评论中所说的那样 未显示货币符号的可能原因是您使用的UserControl未使用正确的文化。当我使用DynamicResource设置Button样式而不在xaml中包含ResourceDictionary时,我发现了类似的行为。我的意思是风格部分应用,就像你的情况,当点变成逗号但没有货币符号时 强制UserCpntrol使用所需文化的一种方法是将此代码段包含在UserControl xaml文件中:

<UserControl x:Class="WpfApplication1.Views.CultureExplicitUC"
             xml:lang="en-GB"<!--This is what you want in your UC-->
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             xmlns:local="clr-namespace:WpfApplication1.Views"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <Grid>

    </Grid>
</UserControl>  

现在对于转换器,您需要创建如下所示的类:

namespace WpfApplication1.Converters
{
    public class DebugConverter : IValueConverter
    {
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            //manipulate your data here
        }

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

请注意,转换器有一个cultureInfo作为参数,因此如果需要,您可以根据开发环境手动更改它。
此外,通过使用转换器,您可以通过执行简单检查来确定传入的数据类型,如: if(value is int)