Estoy escribiendo una aplicación GUI donde necesito habilitar las propiedades de edición de objetos arbitrarios (sus tipos solo se conocen en tiempo de ejecución).PropertyGrid y tipos de objetos dinámicos
He decidido utilizar el control PropertyGrid para habilitar esta funcionalidad. creé la clase siguiente:
[TypeConverter(typeof(ExpandableObjectConverter))]
[DefaultPropertyAttribute("Value")]
public class Wrapper
{
public Wrapper(object val)
{
m_Value = val;
}
private object m_Value;
[NotifyParentPropertyAttribute(true)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public object Value
{
get { return m_Value; }
set { m_Value = value; }
}
}
Cuando llego a una instancia de un objeto que necesito para editar, se crea un contenedor para él y establecerlo como el objeto seleccionado:
Wrapper wrap = new Wrapper(obj);
propertyGrid.SelectedObject = wrap;
Pero Me he encontrado con el siguiente problema: lo anterior funciona como se espera solo cuando el tipo de obj es un tipo personalizado (es decir, una clase que definí por mí mismo o un tipo complejo incorporado) pero no cuando obj es una primitiva.
Por ejemplo, si define:
[TypeConverter(typeof(ExpandableObjectConverter))]
public class SomeClass
{
public SomeClass()
{
a = 1;
b = 2;
}
public SomeClass(int a, int b)
{
this.a = a;
this.b = b;
}
private int a;
[NotifyParentPropertyAttribute(true)]
public int A
{
get { return a; }
set { a = value; }
}
private int b;
[NotifyParentPropertyAttribute(true)]
public int B
{
get { return b; }
set { b = value; }
}
}
Y NO:
Entonces todo funciona hinchan. Por otro lado, cuando realizo el siguiente:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
entonces puedo ver el valor "1" en la red (y no es en escala de grises) pero no puedo editar el valor. Noté que si cambio el tipo de propiedad de "Valor" de Wrapper a int y elimino el atributo TypeConverter, funciona. Obtengo el mismo comportamiento para otros tipos y cadenas primitivos.
¿Cuál es el problema?
¡Gracias de antemano!
¡Muchas gracias, eso funcionó! :) – Marina
¿Por qué esta línea 'parentConverter.GetProperties (context.Instance);' return null? –