I am trying to write markupextension as follows:
[MarkupExtensionReturnType(typeof(Length))] public class LengthExtension : MarkupExtension {
Used as follows:
<Label Content="{units:Length 1 mm}" />
Errs with:
TypeConverter for type "Length" does not support conversion from string.
TypeConverter works if I:
- Put it in the
Value property and enter the default ctor value. - Decorate the
Length attribute with the attribute.
Although it may be x / y, I do not want to make any of these decisions.
Here is the code for the converter:
public class LengthTypeConverter : TypeConverter { public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType) { if (sourceType == typeof(string)) { return true; } return base.CanConvertFrom(context, sourceType); } public override bool CanConvertTo(ITypeDescriptorContext context, Type destinationType) { if (destinationType == typeof(InstanceDescriptor) || destinationType == typeof(string)) { return true; } return base.CanConvertTo(context, destinationType); } public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value) { var text = value as string; if (text != null) { return Length.Parse(text, culture); } return base.ConvertFrom(context, culture, value); } public override object ConvertTo(ITypeDescriptorContext context, CultureInfo culture, object value, Type destinationType) { if (value is Length && destinationType != null) { var length = (Length)value; if (destinationType == typeof(string)) { return length.ToString(culture); } else if (destinationType == typeof(InstanceDescriptor)) { var factoryMethod = typeof(Length).GetMethod(nameof(Length.FromMetres), BindingFlags.Public | BindingFlags.Static, null, new Type[] { typeof(double) }, null); if (factoryMethod != null) { var args = new object[] { length.metres }; return new InstanceDescriptor(factoryMethod, args); } } } return base.ConvertTo(context, culture, value, destinationType); } }
source share