3

我做了一个 UserControl 的例子,但仍然(花了一整天)无法解决我的问题。

我希望 UserControl 有一个复杂的属性,在设计时查看属性网格内的属性,能够更改它等等。复杂属性很简单——它是一个具有一个字符串属性的类。

现在我有两个问题:

1) 当我在属性网格中更改文本的值时 - 值不会转到 Form1.Designer.cs

2)有时当我重建项目(甚至不需要运行)时,我有一个 VS 的弹出窗口,其中说 SettingsCoverter 无法将设置转换为 InstanceDescriptor。这些设置类是我的。请帮助解决这个问题。

 [TypeConverter(typeof(SettingsConverter))]
public class Settings : INotifyPropertyChanged
{
    private string stringText = "123";
    public string StringText
    {
        get { return stringText; }
        set
        {
            stringText = value;
            OnPropertyChanged("StringText");
        }
    }

    public Settings()
    {
    }

    public Settings(string fText)
    {
        StringText = fText;
    }

    protected void OnPropertyChanged(string name)
    {
        PropertyChangedEventHandler handler = PropertyChanged;
        if (handler != null)
            handler(this, new PropertyChangedEventArgs(name));
    }

    #region Implementation of INotifyPropertyChanged

    public event PropertyChangedEventHandler PropertyChanged;

    #endregion
}

class SettingsConverter : ExpandableObjectConverter
{
    public override bool GetCreateInstanceSupported(ITypeDescriptorContext context)
    {
        return true;
    }

    public override object CreateInstance(ITypeDescriptorContext context, System.Collections.IDictionary propertyValues)
    {
        return new Settings((string)propertyValues["StringText"]);
    }

    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(string) || destinationType == typeof(InstanceDescriptor))
            return true;
        return base.CanConvertTo(context, destinationType);
    }

    public override object ConvertTo(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value, Type destinationType)
    {
        if (value is Settings)
        {
            if (destinationType == typeof(InstanceDescriptor))
            {
                Settings settings = (Settings)value;
                object[] properties = new object[1];
                Type[] types = new Type[1];

                types[0] = typeof(string);
                properties[0] = settings.StringText;

                ConstructorInfo ci = typeof(Settings).GetConstructor(types);
                return new InstanceDescriptor(ci, properties);
            }

            if (destinationType == typeof(string))
            {
                Settings settings = (Settings)value;
                return settings.StringText;
            }
        }

        return base.ConvertTo(context, culture, value, destinationType);
    }

    public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
    {
        if (value == null)
            return "";

        if (value is string)
            return new Settings(value as string);

        return base.ConvertFrom(context, culture, value);
    }
}
4

1 回答 1

0

2)这是建议

http://forums.asp.net/t/1309871.aspx?TypeConverter+Error+InstanceDescriptor+

类型转换器直接进入 CLR 的类型信息缓存,而不通过项目系统实现的类型解析服务。这意味着 CLR 将返回它之前在重建之前加载的程序集的类型 - 并且转换将失败,因为设计图面上的类型是从新构建的程序集加载的。我验证您可以通过确保类库项目的版本号在每次构建时自动递增来解决此问题。您可以通过以下方式做到这一点: 1) 调出类库项目的属性 2) 选择“Application”选项卡并单击“Assembly Information...”按钮。3)在版本中,该字段将最后一个条目设置为“*” - 所以它应该说:1 0 0 *

现在,每当构建类库时,修订号(版本的最后一位)将自动递增。这会强制 CLR 使其缓存的条目无效并加载新条目。

于 2016-05-10T03:28:07.020 回答