2011-02-11 11 views
7

में बाध्यकारी मैं इस टेक्स्ट बॉक्स है:दो तरह से स्वरूपित प्रतिशत WPF

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

यह सही ढंग से प्रदर्शित करता है 0.055% के रूप में है, लेकिन यह वापस जा रहा काम नहीं करता। जब मैं प्रतिशत में टाइप करता हूं, तो यह प्रतिशत प्रतीक के कारण विफल रहता है। अगर मैं सिर्फ 5 की तरह लिखने की कोशिश करता हूं, तो मुझे इसके बजाय 500% मिलता है। इसे काम करने के लिए मुझे 0.05 लिखना है।

क्या मुझे अपना प्रतिशत वापस पाने के लिए कस्टम कनवर्टर लिखना है? और यदि हां, तो मैं लोकेल-विशिष्ट प्रतिशत प्रारूपों के आसपास कैसे हो सकता हूं?

उत्तर

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} /> 

यह कुछ सिल्वरलाइट कोड से है, लेकिन WPF

+1

मेरी वर्तमान जरूरतों के लिए पर्याप्त बंद करें, हालांकि कनवर्टर को कुछ ट्वीकिंग की आवश्यकता है (यह संख्या 100 से विभाजित नहीं करता है) और स्थानीयकरण को अनदेखा करता है। धन्यवाद। –

+0

@Ilia - आह, हम 0 से 100 के बजाय हमारे प्रतिशत को 0 से 100 (मुझे क्यों नहीं पूछते) के रूप में स्टोर करते हैं। स्थानीयकरण के लिए - इसे सामना करना पड़ता है - मुझे इसे दोबारा जांचना होगा आवेदन (सिर के लिए धन्यवाद)। – ChrisF

+0

मैंने कोड पोस्ट किया है जिसे मैं एक और जवाब के साथ खुश हूं। मुझे लगता है कि मैं संस्कृति का उपयोग कर सकता हूं। NumberFormat.Percent * अधिक सटीक पार्स के लिए मान, लेकिन यह मेरे लिए काफी अच्छा है। –

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; 
    } 
} 
संबंधित मुद्दे