WPF中的双向百分比格式化绑定

时间:2011-02-11 11:30:16

标签: .net wpf data-binding

我有这个文本框:

<TextBox Text="{Binding Path=TaxFactor, StringFormat=P}" />

它正确地将0.05显示为5%,但它无法恢复。当我输入百分比时,由于符号百分比而失败。如果我尝试只编写一个数字,例如5,我会改为500%。我必须写0.05才能使用它。

我是否必须编写自定义转换器才能获得百分比?如果是这样,我如何解决特定于语言环境的百分比格式?

2 个答案:

答案 0 :(得分:10)

您需要编写自定义转换器。注意:这个假定值存储在0到100的范围内,而不是0到1。

public object Convert(object value, Type targetType, object parameter,
                      System.Globalization.CultureInfo culture)
{
    if (string.IsNullOrEmpty(value.ToString())) return 0;

    if (value.GetType() == typeof(double)) return (double)value / 100;

    if (value.GetType() == typeof(decimal)) return (decimal)value / 100;    

    return value;
}

public object ConvertBack(object value, Type targetType, object parameter,
                          System.Globalization.CultureInfo culture)
{
    if (string.IsNullOrEmpty(value.ToString())) return 0;

    var trimmedValue = value.ToString().TrimEnd(new char[] { '%' });

    if (targetType == typeof(double))
    {
        double result;
        if (double.TryParse(trimmedValue, out result))
            return result;
        else
            return value;
    }

    if (targetType == typeof(decimal))
    {
        decimal result;
        if (decimal.TryParse(trimmedValue, out result))
            return result;
        else
            return value;
    }
    return value;
}

这样称呼:

<TextBox Text="{Binding Path=TaxFactor, Mode=TwoWay, StringFormat=P, 
         Converter={StaticResource percentStringFormatConverter} />

这是来自某些Silverlight代码,但应该适用于WPF

答案 1 :(得分:6)

添加到ChrisF的答案,我最终使用的转换器(仅用于小数):

class DecimalPercentageConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter,
                  System.Globalization.CultureInfo culture)
    {
        return value;
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              System.Globalization.CultureInfo culture)
    {
        if (targetType != typeof(decimal) || value == null)
            return value;

        string str = value.ToString();

        if (String.IsNullOrWhiteSpace(str))
            return 0M;

        str = str.TrimEnd(culture.NumberFormat.PercentSymbol.ToCharArray());

        decimal result = 0M;
        if (decimal.TryParse(str, out result)) {
            result /= 100;
        }

        return result;
    }
}