【问题标题】:Two way percentage formatted binding in WPFWPF中的两种百分比格式绑定
【发布时间】:2011-02-11 11:30:16
【问题描述】:

我有这个文本框:

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

它正确地将0.05 显示为5%,但它无法返回。当我输入百分比时,由于百分比符号而失败。如果我尝试只写一个数字,比如5,我会得到500%。我必须写 0.05 才能让它工作。

我是否必须编写自定义转换器才能恢复我的百分比?如果是这样,我如何绕过特定于区域设置的百分比格式?

【问题讨论】:

    标签: .net wpf data-binding


    【解决方案1】:

    您需要编写一个自定义转换器。注意:这个假设值存储在 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

    【讨论】:

    • 足够接近我当前的需求,尽管转换器需要一些调整(它不会将数字除以 100)并且忽略本地化。谢谢。
    • @Ilia - 啊,我们将百分比存储为从 0 到 100 的数字(不要问我为什么)而不是 0 到 1。至于本地化 - 它应该可以应付 - 我会必须在我们的应用程序上仔细检查这一点(感谢提醒)。
    • 我发布了我满意的代码作为另一个答案。我猜我可以使用culture.NumberFormat.Percent* 值进行更准确的解析,但这对我来说已经足够了。
    • WPF 的 ProgressBar 类使用 0 到 100 的范围。也许这就是您的代码库使用 0 到 1 的原因。
    • @emddudley - 我们实际上正在编写一个 Silverlight 应用程序 :) 加上数字不在进度条上。但除此之外,这是个好主意;)
    【解决方案2】:

    除了 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;
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-03
      • 2021-03-01
      • 1970-01-01
      • 2016-08-03
      • 2012-07-31
      • 2016-10-24
      • 1970-01-01
      相关资源
      最近更新 更多