Двухстороннее форматированное процентное связывание в WPF - PullRequest
8 голосов
/ 11 февраля 2011

У меня есть это текстовое поле:

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

Он правильно отображает 0.05 как 5%, но не работает в обратном направлении. Когда я набираю в процентах, происходит сбой из-за символа процента. Если я попытаюсь написать только число, например 5, я получу 500%. Я должен написать 0.05, чтобы он заработал.

Должен ли я написать собственный конвертер, чтобы вернуть мой процент? И если да, то как мне найти форматы процентного соотношения для конкретной локали?

Ответы [ 2 ]

10 голосов
/ 11 февраля 2011

Вам необходимо написать собственный конвертер.ПРИМЕЧАНИЕ: это предполагает, что значения хранятся в диапазоне от 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} />

thisиз некоторого кода Silverlight, но должен работать с WPF

6 голосов
/ 11 февраля 2011

Добавляя к ответу 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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...