Я пишу приложение GUI, где мне нужно включить редактирование свойств произвольных объектов (их типы известны только во время выполнения).PropertyGrid и динамические типы объектов
Я решил использовать элемент управления PropertyGrid для включения этой функции. Я создал следующий класс:
[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; }
}
}
Когда я получить экземпляр объекта мне нужно редактировать, создать обертку для него и установить его в качестве выбранного объекта:
Wrapper wrap = new Wrapper(obj);
propertyGrid.SelectedObject = wrap;
Но я мы сталкиваемся с следующей проблемой: работа выше, как и ожидалось, только тогда, когда тип obj - это особый тип (то есть класс, который я определил сам или встроенный сложный тип), но не тогда, когда obj является примитивным.
Например, если я определяю:
[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; }
}
}
И сделать:
Тогда все работает набухать. С другой стороны, когда я выполняю следующее:
int num = 1;
Wrapper wrap = new Wrapper(num);
propertyGrid.SelectedObject = wrap;
Тогда я могу увидеть значение «1» в сетке (и это не оттенками серого), но я не могу изменить значение. Я заметил, что если я изменил тип свойства Wrapper на «значение» на int и удалил атрибут TypeConverter, он будет работать. Я получаю такое же поведение для других примитивных типов и строк.
В чем проблема?
Заранее благодарен!
Спасибо большое, что сделал трюк! :) – Marina
Почему эта строка 'parentConverter.GetProperties (context.Instance);' return null? –