Как использовать ExpandableObjectConverter для свойства абстрактного типа в PropertyInspector - PullRequest
3 голосов
/ 08 декабря 2011

Я хочу, чтобы PropertyInspector позволял мне выбирать конкретный тип экземпляра для установки в свойстве абстрактного типа и расширяться до свойств этого типа, используя знак [+], как это обычно предоставляетсяExpandableObjectConverter.

Однако кажется, что при использовании абстрактного типа в качестве свойства единственным выбираемым значением в списке является (null), и ничего не расширяется.Это я могу понять, поскольку у редактора нет возможности узнать, какие типы я хочу предоставить.

Но если я предоставлю свой собственный редактор с помощью EditorAttribute, который присваивает свойству конкретный экземпляр, производный от абстрактного типа, [+] - знак не появляется, и я не могу расшириться до вложенных свойств.

Я использовал несколько простых тестовых классов, таких как:

public abstract class Test
{
   public string Name { get; set; }
}

public class TestImpl : Test
{
   public string Description { get; set; }
}

public class MyObject
{
   [TypeConverter(typeof(ExpandableObjectConverter))]
   public Test MyTest { get; set; }
}

Как мне достичь того, что яхотите, чтобы свойство MyTest имело редактор, позволяющий мне выбрать конкретный тип, который я хочу, и когда я это сделаю, должен появиться знак [+], чтобы я мог установить свойства этого объекта?

Редактировать:

При использовании обычного PropertyGrid в Windows Forms следующий конвертер будет делать в точности то, что я хочу:

public class MyConverter : ExpandableObjectConverter
{
   public override bool GetStandardValuesSupported(ITypeDescriptorContext context)
   {
      return true;
   }

   public override StandardValuesCollection GetStandardValues(ITypeDescriptorContext context)
   {
      StandardValuesCollection coll = new StandardValuesCollection(new Test[] {  new TestImpl() });
      return coll;
   }

   public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
   {
      return sourceType == typeof(string);
   }

   public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
   {
      return Activator.CreateInstance(Type.GetType((string)value));
   }
}

Однако в конструкторе рабочих процессов(или PropertyInspector), кажется, не добавляет никакой функциональности (или, по крайней мере, не тот, который я хочу).На самом деле кажется, что никакие методы в конвертере даже не вызываются, что выглядит очень странно.

При изменении типа свойства MyObject.MyTest на TestImpl, ExpandableObjectConverter работает.

(В действительности, конечно, было бы более одного класса, производного от абстрактного Test)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...