Here is an example:
[ValueConversion(typeof(float), typeof(String))]
public class PercentConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value == null || string.IsNullOrEmpty(value.ToString()))
return string.Empty;
if (value is float) //Edited to support CultureInfo.CurrentCulture,
return string.Format(culture, "{0:n}{1}", ((float)value) * 100, "%");
//** Is it ok to put Exception here or should I return "something" here? **
throw new Exception("Can't convert from " + value.GetType().Name + ". Expected type if float.");
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException("Converting back is not implemented in " + this.GetType());
}
}
As advertised, it just implements the two required methods, called Convert() and ConvertBack(). The Convert() methods assumes that it receives a string as the input (the value parameter) and then converts it to a Boolean true or false value, with a fallback value of false.
The IValueConverter interface consists of two methods, Convert() and ConvertBack() . Convert method gets called when source updates target object. ConvertBack method gets called when target updates source object.
To use the converter you need to implement the interface of the converter class in the XAML page of WPF and need to declare the resource. After declaring the resource there is the need to use it with binding. See the following XAML code example. XAML Example: The code example uses a converter in WPF XAML.
If you want to associate a value converter with a binding, create a class that implements the IValueConverter interface and then implement the Convert and ConvertBack methods.
If you fail to convert (malformed values, types, ...), return DependencyProperty.UnsetValue.
It indicates that the converter produced no value and that the binding uses the FallbackValue, if available, or the default value instead.
Also, you should convert data with culture-specific conversion or invariant conversions to be on the safe side.
I personally recommend using singleton converters. Then you don't have to create an instance at every usage site, but can reference the converter like this:
Converter={x:Static SomeNamespace:SomeConverter.Instance}
You've ignored CultureInfo
while parsing the string.
Always take in to account the culture info passed otherwise it would always work on Thread's CurrentCulture.
I could give some thing like "7.34,123" as input, would your code work?
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With