PropertyGrid - Коллекция Edition / Wrapper - PullRequest
0 голосов
/ 30 марта 2012

У меня сложный вид свойства, которое я хочу редактировать в PropertyGrid.

interface IInterface{}

abstract class Base : IInterface{}

class A : Base{}
class B : Base{}

Эти классы представляют то, что может храниться в свойстве (содержание этих классов не имеет значения).

// The Property to be displayed in the PropertyGrid
class Property
{
    List<Base> MyListOfObjects {get;set;}        
}

Мне удалось создать производный класс System.ComponentModel.Design.CollectionEditorкоторый позволяет мне добавлять различные виды данных, используя атрибут [Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))] в свойстве коллекции.

class MyCollectionEditor : CollectionEditor
{
    public MyCollectionEditor(Type type) : base(type)
    {            
    }

    #region Overrides of CollectionEditor
    protected override Type[] CreateNewItemTypes()
    {
        base.CreateNewItemTypes();
        // [EDIT assembly, see below]
        var types = (from t in Assembly.GetAssembly(typeof(IInterface)).GetTypes()
                     where t.GetInterfaces().Contains(typeof (IInterface)) && !t.IsAbstract
                     select t).ToArray();
        return types;
    }

    protected override Type CreateCollectionItemType()
    {
        return typeof(A); // 1st problem
    }
}
  • Первая проблема: единственное решение, которое я нашел, - возможность редактировать объектыдолжен дать конкретный тип дочернего класса в CreateCollectionItemType().Зачем?Как этого избежать?

  • Вторая проблема: теперь я хочу использовать оболочку, чтобы передать это свойство элементу propertyGrid.Вместо того чтобы иметь атрибуты свойств (например, [Category("General")]) в модели, я хочу поместить их в оболочку.

Работает отлично для всего, кроме коллекции.Вот как я это сделал:

class abstract WrapperBase<T>
{
    T WrappedObject{get;set;}
}
class PropertyWrapper:WrapperBase<Property>
{
    List<Base> MyListOfObjects
    {
        get{return WrappedObject.MyListOfObjects;}
        set{WrappedObject.MyListOfObjects=value;}
    }
}

При этом редактор коллекции не позволит мне добавлять объекты в эту коллекцию, и выпадающий список, доступный для добавления объекта определенного типа, исчез.

Есть идеи?Заранее спасибо!


[EDIT]

Вторая часть проблемы решена: поскольку обертка находится в другой сборке, я не искалв нужном месте для реализации IInterface.

1 Ответ

0 голосов
/ 31 марта 2012

CreateNewItemTypes - это хорошо.в CreateCollectionItemType вернуть базовый тип.я думаю, что это должно сработать.

...