PropertyGrid - Collection Edition / Wrapper

时间:2012-03-29 20:36:23

标签: c# winforms propertygrid

我想在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;}
    }
}

有了这个,集合编辑器不允许我向这个Collection添加对象,并且可用于添加特定类型对象的下拉列表已经消失。

有什么想法吗?提前谢谢!


[编辑]

问题的第二部分已经解决:由于包装器位于另一个程序集中,因此我没有找到适合IInterface实现的地方。

1 个答案:

答案 0 :(得分:0)

CreateNewItemTypes很好。在CreateCollectionItemType中返回基类型。我认为这应该有用。