2012-03-29 9 views
0

PropertyGridで編集したい複雑な種類のプロパティがあります。PropertyGrid - Collection Edition/Wrapper

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;}   
} 

私は私がコレクションプロパティに[Editor(typeof(MyCollectionEditor), typeof(UITypeEditor))]属性を使用して、件のデータの異なる種類を追加することができますSystem.ComponentModel.Design.CollectionEditorの派生クラスを作成するために管理。

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()に、具体的な子クラスの種類を与えることです。どうして?それを避ける方法は?

  • 第2の問題:このプロパティを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]

問題の第2の部分は解決される:ラッパーは別のアセンブリに位置しているので、私はメソッドはIInterfaceの実装のための適切な場所に見ていませんでした。

答えて

0

CreateNewItemTypesは良好です。 CreateCollectionItemTypeで基本型を返します。私はそれがうまくいくと思います。

+0

私はそれを試みましたが、PropertyGridは派生型に固有のフィールドを提供しません。 – Benjamin