У меня сложный вид свойства, которое я хочу редактировать в 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.