2012-02-15 5 views
1

私はいくつかのデータを編集する必要があるアプリケーションを持っており、PropertyGrid構造は視覚的に私のニーズにとって最も良い候補です。ただし、PropertyGridはオブジェクトのパブリックプロパティを取得し、グリッドに表示します。 (属性付きの追加オプション)。しかし、私は編集する必要があるキーと値のペアのリストが動的なので、私はそのようなオブジェクトを持っていません。上記のコードは次のようになり、プロパティグリッドを生成するPropertyGridをオブジェクトなしで使用できますか?

public class GridParam 
{ 
    // ... several constructors here, one for each type 
    // ... or a single one but with generic class, does not matter 

    public String Name { get; set; } 
    public Object Value { get; set; } 
    public Type ItemType { get; set; } 
} 

GridParam stringParam = new GridParam("Address", "2534 Barkeley Av."); 
GridParam numberParam = new GridParam("Year", 2012); 

NewKindOfPropertyGrid grid = new NewKindOfPropertyGrid(); 
grid.AddParam(stringParam); 
grid.AddParam(numberParam); 

理想的なソリューションは、このようなものになるだろう enter image description here

は、PropertyGridのか、他のと、この可能性のようなものです既存のコントロール(少なくともPGに似ています)? 構文は私が書いたものと似ている必要はありませんが、クラスを定義することなく、動的である可能性があるそのようなプロパティのコレクションを受け入れることができる必要があります。

+0

http://stackoverflow.com/questions/313822/how-to-modify-propertygrid-at-runtime-add-remove-property-and-dynamic-types-enu –

答えて

2

ここには2つのオプションがあります。

GridParamインスタンスのIEnumerable<T>を取るクラスにICustomTypeDescriptor interfaceを実装するのが最初の(より単純なIMO)ものです。

PropertyGrid classは、実際には反射を使用しません。;代わりに、TypeDescriptor classを使用して、オブジェクトのインスタンスに関するメタデータを取得します。このメタデータは、デフォルトでリフレクションを使用します。

ICustomTypeDescriptorを実装すると、PropertyGridは実装からTypeDescriptorの情報をすべて取得します。あなたは、それがあなたが望むものを餌にするだけです。

この場合、GetPropertiesの実装ではGridParamインスタンスごとにPropertyDescriptorが入力されたPropertyDescriptorCollectionが返されます。

他のはるかに難しい(おそらく)オプションは、型を動的に作成してそれにバインドすることです(PropertyGridはバインドするためにobjectを取ります)。もちろん、実際にはICustomTypeDescriptorの実装のほとんどが何らかのレベルで複製しているので、前者の方が良いでしょう。

関連する問題