Winforms Designer自定义属性在生成时不保留其值

Winforms Designer自定义属性在生成时不保留其值,winforms,visual-studio-2005,designer,Winforms,Visual Studio 2005,Designer,我有一个控件,我从Label(作为一个示例)中创建子类,并向其添加自定义属性。我有一个自定义编辑器,允许我选择自定义类型的对象。自定义类型由转换器和编辑器赋予属性。编辑工作正常-我在VS designer属性网格中单击我的属性单元格并显示省略号。我点击它,我得到了我的自定义表单,显示我的列表供选择。我做了一个选择,该选择显示在我的属性网格中。一切都好。然而,我似乎无法像处理大多数属性那样通过在该值上退格来清除该值。更重要的是,一旦我建造了这个项目,财产价值就消失了。在我构建之前,我可以从一个控件

我有一个控件,我从Label(作为一个示例)中创建子类,并向其添加自定义属性。我有一个自定义编辑器,允许我选择自定义类型的对象。自定义类型由转换器和编辑器赋予属性。编辑工作正常-我在VS designer属性网格中单击我的属性单元格并显示省略号。我点击它,我得到了我的自定义表单,显示我的列表供选择。我做了一个选择,该选择显示在我的属性网格中。一切都好。然而,我似乎无法像处理大多数属性那样通过在该值上退格来清除该值。更重要的是,一旦我建造了这个项目,财产价值就消失了。在我构建之前,我可以从一个控件切换到另一个控件,并且正确设置了值,但是一旦我构建(或保存并关闭表单),属性就会丢失其值。我的自定义控件如下所示:

public class MyLabel : Label
{
    private MyAlias _alias;

    public MyAlias Alias
    {
        get
        {
            return _alias;
        }
        set
        {
            if (_alias != value)
            {
                _alias = value;
            }
        }
    }
}
自定义类型:

[System.ComponentModel.TypeConverter(typeof(MyConverter))]
[System.ComponentModel.Editor(MyTypeEditor, System.Drawing.Design.UITypeEditor)]
public class MyAlias
{
    private string _aliasName;

    public string AliasName
    {
        get
        {
            return _aliasName;
        }
        set
        {
            if (_aliasName != value)
            {
                _aliasName = value;
            }
        }
    }

    public MyAlias(string aliasName)
    {
        if (aliasName == null)
        {
            return;
        }

        _aliasName = aliasName;
    }

    public override string ToString()
    {
        return _aliasName;
    }
}
自定义转换器:

public class MyConverter : TypeConverter
{
    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, System.Globalization.CultureInfo culture, object value)
    {
        if (!(value is string))
        {
            return base.ConvertFrom(context, culture, value);
        }

        return new MyAlias((string)value);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (destinationType == null)
        {
            throw new ArgumentNullException("destinationType");
        }

        MyAlias alias = (MyAlias)value;
        return alias.ToString();
    }
}
自定义编辑器:

public partial class AliasEditorForm : Form
{
    private object _value;

    public object Value
    {
        get
        {
            return _value;
        }
        set
        {
            if (_value != value)
            {
                _value = value;
            }
        }
    }

    public AliasEditorForm()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        // Button does have DialogResult property set to OK
        _value = new MyAlias(...text string from form controls here...);
        this.Close();
    }
}

public class MyTypeEditor : UITypeEditor
{
    protected IWindowsFormsEditorService edSvc = null;

    public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
    {
        return UITypeEditorEditStyle.Modal;
    }

    public override object EditValue(System.ComponentModel.ITypeDescriptorContext context, IServiceProvider provider, object value)
    {
        if (null != context && null != context.Instance && null != provider)
        {
            edSvc = (IWindowsFormsEditorService)provider.GetService(typeof(IWindowsFormsEditorService));
            if (null != edSvc)
            {
                AliasEditorForm form = new AliasEditorForm();
                form.Value = value;
                DialogResult r = edSvc.ShowDialog(form);
                return (DialogResult.OK == r) ? form.Value : value;
            }
        }
        return value;
    }
}
我已经很久没有在WinForms中工作了,我从来没有真正涉足过设计时的东西,所以如果我做了一些非常愚蠢的事情,请原谅我。如果我没有提供足够的信息,请告诉我。提前谢谢

编辑:我注意到它没有在form.Designer.cs文件中生成属性的代码。还是不知道为什么

编辑:更改了类型转换器的代码。我现在可以通过退格清除该属性。我仍然无法让设计器生成代码来保留属性值


丹尼斯

这个答案可能有用,谢谢你的回复,马特!不幸的是,我确实尝试了该属性,但它不起作用。我尝试将该值设置为“内容”,也尝试将其设置为“可见”。这两个值都没有解决问题(内容实际上让问题变得更糟,因为在我没有设置别名值的控件上给了我一个错误)?我这里有一个类似的问题。我的自定义控件的公共属性为List。在designer中,它会打开标准列表编辑器,当我在此处添加一些字符串时,它可以正常工作,但当自定义控件(仍在designtime中,而不是运行时!)在代码中填充一些字符串时,这些字符串将永远不会进入designer.cs文件,即使它们在属性窗口的设计时可见。。。