. "" ICustomTypeDescriptor, DataRowView ( DataRow). , PropertyDescriptor:
public class MyPropertyDescriptor<TComponent, TValue> : PropertyDescriptor
{
private readonly Func<TComponent, TValue> getter;
private readonly Action<TComponent, TValue> setter;
public MyPropertyDescriptor(string name, Func<TComponent, TValue> getter, Action<TComponent, TValue> setter)
: base(name, null)
{
this.getter = getter;
this.setter = setter;
}
public override bool CanResetValue(object component)
{
return true;
}
public override object GetValue(object component)
{
return getter((TComponent)component);
}
public override void ResetValue(object component)
{
setter((TComponent)component, default(TValue));
}
public override void SetValue(object component, object value)
{
setter((TComponent)component, (TValue)value);
}
public override bool ShouldSerializeValue(object component)
{
return true;
}
public override Type ComponentType
{
get { return typeof(TComponent); }
}
public override bool IsReadOnly
{
get { return false; }
}
public override Type PropertyType
{
get { return typeof(TValue); }
}
}
Person ICustomTypeDescriptor:
public class Person : ICustomTypeDescriptor
{
public string Name { get; set; }
public int Age { get; set; }
public PropertyDescriptorCollection GetProperties(Attribute[] attributes)
{
PropertyDescriptor[] propertyDescriptors = new PropertyDescriptor[]
{
new MyPropertyDescriptor<Person, string>("My Name", p => p.Name, (p, s) => p.Name = s),
new MyPropertyDescriptor<Person, int>("My Age", p => p.Age, (p, i) => p.Age = i)
};
return new PropertyDescriptorCollection(propertyDescriptors);
}
}
GridView ...

, , , . , , , , ( , ).