2011-02-11 18 views
7

que tiene el campo respectivo:porcentaje de dos vías con formato de unión en WPF

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

Se muestra correctamente como 0.055%, pero no funciona vuelta atrás. Cuando escribo un porcentaje, falla debido al símbolo de porcentaje. Si intento escribir solo un número, como 5, obtengo 500% en su lugar. Tengo que escribir 0.05 para que funcione.

¿Debo escribir un convertidor personalizado para recuperar mi porcentaje? Y si es así, ¿cómo puedo evitar los formatos de porcentaje específicos de la configuración regional?

Respuesta

10

Necesita escribir un convertidor personalizado. NOTA: esto supone que los valores se almacenan en el rango de 0 a 100 en lugar de 0 a 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; 
} 

la llamada de esta manera:

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

esto es de algún código de Silverlight, pero debe trabajar con WPF

+1

Lo suficientemente cerca como para mis necesidades actuales, aunque el convertidor necesita algunos ajustes (no divide el número entre 100) e ignora la localización. Gracias. –

+0

@Ilia - ah, almacenamos nuestros porcentajes como números del 0 al 100 (no me pregunten por qué) en lugar de 0 a 1. En cuanto a la localización, se supone que debe hacer frente, tendré que verificar esto en nuestra aplicación (gracias por el aviso). – ChrisF

+0

Publiqué el código que me satisface como otra respuesta. Supongo que podría usar los valores de culture.NumberFormat.Percent * para un análisis más preciso, pero esto es lo suficientemente bueno para mí. –

6

Agregando a la respuesta de ChrisF, el convertidor terminé usando (sólo para los decimales):

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; 
    } 
} 
Cuestiones relacionadas