1

オブジェクトに のカスタム プロパティがある 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; 
    }
}

このコードは、単純な値の設定と取得で正しく機能します。アドバイスが必要なのは、実行時に作成される動的プロパティを含むドロップダウン リストを表示する方法です。

a を使用して aTypeConverterを取得する方法は理解してStandardValuesCollectionいますが、動的プロパティでこれを行う方法がわかりません。この属性を動的プロパティに追加する必要がありますか? また、CustomWebpageObjectTypeUserObjectCustomPropertyDescriptorクラスで行う必要がありますか? この属性を追加するために実装する必要があるオーバーライドはありますか? これを別の方法で行う必要がありますか?

前もって感謝します。

4

0 に答える 0