PropertyGrid .
TypeConverter, / PropertyGrid. "" . /. Typeconverter .
UITypeEditor , (, , colorpicker,... )
DisplayName , . , . , .
(, Rune Grimstad ), , [Browsable (false)].
DefaultValue, , DefaultValue, . , .
, TextBox . , ( TypeConverter) . -, :
class BaseWrapper<T> {
public BaseWrapper(T tb) {
this.Wrapped = tb;
}
[Browsable(false)]
public T Wrapped { get; set; }
public object GetMember(string name) {
var prop = this.Wrapped.GetType().GetProperty(name);
return prop.GetValue(this.Wrapped, null);
}
public void SetMember(string name, object value) {
var prop = this.Wrapped.GetType().GetProperty(name);
prop.SetValue(this.Wrapped, value, null);
}
}
class BaseConverter<T> : TypeConverter {
protected class pd : SimplePropertyDescriptor {
public pd(string displayName, string name) : base(typeof(BaseWrapper<T>), displayName, typeof(string)) {
this.PropName = name;
}
public string PropName { get; set; }
public override object GetValue(object component) {
var wrapper = (BaseWrapper<T>)component;
return wrapper.GetMember(this.PropName);
}
public override void SetValue(object component, object value) {
var wrapper = (BaseWrapper<T>)component;
wrapper.SetMember(this.PropName, value);
}
}
public override bool GetPropertiesSupported(ITypeDescriptorContext context) {
return true;
}
}
[TypeConverter(typeof(TextBoxConverter))]
class TextboxWrapper : BaseWrapper<TextBox> {
public TextboxWrapper(TextBox t) : base(t) { }
}
class TextBoxConverter : BaseConverter<TextBox> {
public override PropertyDescriptorCollection GetProperties(ITypeDescriptorContext context, object value, Attribute[] attributes) {
return new PropertyDescriptorCollection(new PropertyDescriptor[] {
new pd(" ", "Text")
});
}
}
, :
this.propertyGrid1.SelectedObject = new TextboxWrapper(this.textBox1);
pd ( , ), .