将TypeConverter添加到动态属性

时间:2015-08-20 10:35:48

标签: c# propertygrid typeconverter dynamic-properties

我正在编写一个C#表单应用程序,其中一个对象具有PropertyGrid的自定义属性。这些自定义属性在运行时显示。

这是我的代码:

private readonly List<CustomProperty> props = new List<CustomProperty>();
[Browsable(false)]
public List<CustomProperty> properties { get { return props; } }

private Dictionary<string, object> values = new Dictionary<string, object>();

public object this[string name]
{
    get { object val; values.TryGetValue(name, out val); return val; }
    set 
    { 
        values[name] = value;
    }
}
private class CustomWebpageObjectTypeUserObjectConverter : ExpandableObjectConverter
{
    public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes)
    {
        var stdProps = base.GetProperties(context, value, attributes);
        CustomWebpageObjectTypeUserObject obj = value as CustomWebpageObjectTypeUserObject;
        List<CustomProperty> customProps = obj == null ? null : obj.properties;
        PropertyDescriptor[] props = new PropertyDescriptor[stdProps.Count + (customProps == null ? 0 : customProps.Count)];
        stdProps.CopyTo(props, 0);
        if (customProps != null)
        {
            int index = stdProps.Count;
            foreach (CustomProperty prop in customProps)
            {
                CustomWebpageObjectTypeUserObjectCustomPropertyDescriptor customWebpageObjectTypeUserObjectCustomPropertyDescriptor = new CustomWebpageObjectTypeUserObjectCustomPropertyDescriptor(prop);
                props[index++] = customWebpageObjectTypeUserObjectCustomPropertyDescriptor;
            }
        }
        return new PropertyDescriptorCollection(props);
    }
}

public class CustomWebpageObjectTypeUserObjectCustomPropertyDescriptor : PropertyDescriptor
{
    private readonly CustomProperty prop;
    public CustomWebpageObjectTypeUserObjectCustomPropertyDescriptor(CustomProperty prop)
        : base(prop.name, null)
    {
        this.prop = prop;
    }
    public override string Category { get { return prop.category; } }
    public override string Description { get { return prop.description; } }
    public override string Name { get { return prop.name; } }
    public override bool ShouldSerializeValue(object component) { return ((CustomWebpageObjectTypeUserObject)component)[prop.name] != null; }
    public override void ResetValue(object component) { ((CustomWebpageObjectTypeUserObject)component)[prop.name] = null; }
    public override bool IsReadOnly { get { return false; } }
    public override Type PropertyType { get { return prop.type; } }
    public override bool CanResetValue(object component) { return true; }
    public override Type ComponentType { get { return typeof(CustomWebpageObjectTypeUserObject); } }
    public override void SetValue(object component, object value) 
    { 
        ((CustomWebpageObjectTypeUserObject)component)[prop.name] = value;
        prop._value = value;
    }
    public override object GetValue(object component) 
    { 
        return ((CustomWebpageObjectTypeUserObject)component)[prop.name] ?? prop._value; 
    }
}

此代码可以使用简单的set和get值正常工作。我需要一些建议是如何显示一个下拉列表,其中包含在运行时创建的动态属性。

我了解如何使用TypeConverter来获取StandardValuesCollection,但我不确定如何使用动态属性执行此操作。我是否需要将此属性添加到动态属性中,是否需要在CustomWebpageObjectTypeUserObjectCustomPropertyDescriptor类中完成此操作?是否需要实现添加此属性的覆盖?我是否需要以另一种方式做到这一点?

提前致谢。

0 个答案:

没有答案
相关问题