WPF货币符号

时间:2019-08-23 14:50:22

标签: c# wpf currency

我在软件中使用两种不同的货币。根据公司来源,如何在数字数据之前显示货币。 £或€

<TextBlock Text="{Binding FNetPriceAfterDisc,StringFormat=c}"  />

我想在后面的代码中绑定“ c”。如果可能的话。

我尝试了此操作,但不起作用。不知道怎么了。

                                     <TextBlock  HorizontalAlignment="Center" >
                                    <TextBlock.Style>
                                        <Style TargetType="TextBlock">
                                            <Setter Property="Text" Value="{Binding FNetPriceAfterDisc,StringFormat=€0.000}" />
                                            <Style.Triggers>
                                                <DataTrigger Binding="{Binding Country}" Value="UK">
                                                    <Setter Property="Text" Value="{Binding FNetPriceAfterDisc,StringFormat=c}" />
                                                </DataTrigger>
                                            </Style.Triggers>
                                        </Style>
                                    </TextBlock.Style>
                                </TextBlock>

2 个答案:

答案 0 :(得分:3)

我会给每个项目一个language identifier tag作为字符串:en-GBdeen-US等,然后编写一个MultiValueConverter并将其用于为任意区域性设置具有任意格式的任意文本的格式。由于用于指定“ currency”的格式字符串也是一个参数,因此可以将其用于其他本地化任务。重要的不只是简单地对货币符号进行硬编码:如果意大利离开欧元区,您就不必为此沉迷(除非欧盟支付您的薪水)。

public class CultureFormatConverter : IMultiValueConverter
{
    public object Convert(object[] values, Type targetType, object parameter, 
        CultureInfo culture)
    {
        var value = values[0];
        var format = values[1] as String;
        var targetCulture = values[2] as string;

        return string.Format(new System.Globalization.CultureInfo(targetCulture), 
            format, value);
    }

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

在资源所在的范围内的地方创建转换器:

<local:CultureFormatConverter x:Key="CultureFormatConverter" />

然后像这样使用它:

<TextBlock>
    <TextBlock.Text>
        <MultiBinding Converter="{StaticResource CultureFormatConverter}">
            <!-- Bind to FNetPriceAfterDisc property of the viewmodel -->
            <Binding Path="FNetPriceAfterDisc" />

            <!-- To pass a literal value with a binding, assign it to Source -->
            <Binding Source="{}{0:c}" />

            <!-- 
            Bind to Culture property of the viewmodel: Should be String that returns 
            "de" for Germany, "en-GB" for UK, null for Pennsylvania and Australia. 
            If you want a fixed value, make it Source="de" or whatever, not Path="de".
            But if you want to use a constant culture value, you might be happier 
            just using the ConverterCulture parameter to an ordinary binding. 
            -->
            <Binding Path="Culture" />
        </MultiBinding>
    </TextBlock.Text>
</TextBlock>

答案 1 :(得分:0)

您可以在父类上实现IFormattable接口,也可以定义公司起源的IValueConverter' and using as ConverterParameter`。

或者,如果绑定对象中已经有货币类型作为属性,则可以使用MultiBinding:

  <TextBlock>
    <TextBlock.Text>
      <MultiBinding  StringFormat="{}{0} {1}">
        <Binding Path="FNetPriceAfterDisc"/>
        <Binding Path="CompanyCurrency"/>
      </MultiBinding>
    </TextBlock.Text>
  </TextBlock>

编辑: 旧行是:

      <MultiBinding  StringFormat="{0} {1}">

正确的行是

      <MultiBinding  StringFormat="{}{0} {1}">