How to show null string in TypeConverter of Value Collection? WinForms Designer

Viewed 70

From this question WinForms designer properties of different derived types Answer by @Reza Aghaei is very good.

But about make value = null. Yes its done by following. But the WinForms Designer doesn't show (Null) literal string.

Here's implementation

public class ValueElementConverter : ExpandableObjectConverter
{
    ValueElement[] standardValues = new ValueElement[] { null, new StaticValue(), new DynamicValue() };
    public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
    {
        if (sourceType == typeof(string)) return true;
        return base.CanConvertFrom(context, sourceType);
    }
    public override object ConvertFrom(ITypeDescriptorContext context, CultureInfo culture, object value)
    {
        if (value == null) return null;
        if (value.ToString().Trim().Length == 0)
            return null;
        else
        {
            var result = standardValues.FirstOrDefault(x => !string.IsNullOrWhiteSpace(x?.ToString()) && x.ToString() == value?.ToString());
            if (result != null)
                return result;
            return base.ConvertFrom(context, culture, value);
        }
    }
    public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
    {
        return true;
    }
    public override bool GetStandardValuesExclusive(ITypeDescriptorContext context)
    {
        return true;
    }        

    public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
    {
        List<ValueElement> xx = new List<ValueElement>();
        return new StandardValuesCollection(standardValues);
    }

}

[TypeConverter(typeof(ValueElementConverter))]
public abstract class ValueElement
{
}

public class StaticValue : ValueElement
{
    public string value { get; set; }

    public override string ToString()
    {
        return "Static";
    }
}

public class DynamicValue : ValueElement
{
    public string dynamicValue;

    public override string ToString()
    {
        return "Dynamic";
    }
}

Here's result. awesome except first value which is null in standardValues collection. but doesn't show Null string literal in Visual Studio WinForms designer.

See Image

0 Answers
Related