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の実装のための適切な場所に見ていませんでした。
私はそれを試みましたが、PropertyGridは派生型に固有のフィールドを提供しません。 – Benjamin