Piszę aplikację GUI, w której muszę włączyć edycję właściwości dowolnych obiektów (ich typy są znane tylko w czasie wykonywania).PropertyGrid i dynamiczne typy obiektów
Postanowiłem użyć kontrolki PropertyGrid, aby włączyć tę funkcję. stworzyłem następujące klasy:
[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; }
}
}
Kiedy się wystąpienie obiektu muszę zmieniać, tworzę otoki dla niego i ustawić go jako wybranego obiektu:
Wrapper wrap = new Wrapper(obj);
propertyGrid.SelectedObject = wrap;
Ale napotkaliśmy następujący problem - powyższe działa zgodnie z oczekiwaniami tylko wtedy, gdy typ obj to jakiś niestandardowy typ (tj. klasa, którą zdefiniowałem samodzielnie lub wbudowany typ złożony), ale nie wtedy, gdy obiekt jest prymitywny.
Na przykład, jeśli określenie:
[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; }
}
}
I zrobić:
Potem wszystko działa puchnąć. Z drugiej strony, kiedy należy wykonać następujące czynności:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
Wtedy widzę wartości „1” w sieci (i to nie grayscaled), ale nie można edytować wartości. Zauważyłem, że jeśli zmienię typ właściwości "Value" Wrappera na int i usunę atrybut TypeConverter, to działa. Otrzymuję to samo zachowanie dla innych pierwotnych typów i ciągów.
Na czym polega problem?
Z góry dziękuję!
Wielkie dzięki, to się udało! :) – Marina
Dlaczego ta linia 'parentConverter.GetProperties (context.Instance); zwraca NULL? –