質問

ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter、および UITypeEditor を使用して、PropertyGrid の表示方法とオブジェクトとのインターフェース方法を変更する方法を全体的に理解しようとしています。

これが正しいかどうか、または主要な概念やポイントを見逃していないかどうか、誰かが教えてくれませんか?私は、各クラスをなぜ、いつ使用するのかを理解しようとしているだけです。

ICustomTypeDescriptor

  • このインターフェイスをクラスに実装すると、クラスのネイティブ プロパティが完全にオーバーライドされ、ICustomTypeDescriptor.GetProperties() によって返される PropertyDescriptors に置き換えられます。

タイプ説明プロバイダー

  • クラスの既存のプロパティを拡張するために使用されます
  • TypeDescriptionProvider は、TypeDescriptionProvider 属性を通じてクラスに追加されます。
  • TypeDescriptionProvider の GetTypeDescriptor() メソッドは、次の ICustomTypeDescriptor を返します。 添付 タイプの既存のプロパティに適用されます。
  • PropertyGrid には、Reflection を通じて見つかったクラスのプロパティと、TypeDescriptionProvider を通じてクラスに追加されたプロパティの両方が表示されます。

タイプコンバータ

  • 型間の変換
  • PropetyGrid の使用に関しては、プロパティ グリッドで表示/編集できる複合型とプリミティブ型の間の変換に使用されます。
  • TypeConverter の GetStandard 値メソッドを使用して、propertygrid 内の可能な値のリストを表示することもできます。

UIタイプエディタ

  • 複合型のプロパティを操作するためのカスタム エディターを定義します。
  • 属性を通じてプロパティに関連付けられます。

したがって、ICustomTypeDescriptor と TypeDescription プロバイダーは、オブジェクトのプロパティ全体を追加/変更/置換するために使用されます。TypeConverter と UITypeEditor は個々のプロパティに適用され、それらの特定のプロパティとのインターフェイス方法を制御します。

役に立ちましたか?

解決

微調整:

  • TypeDescriptionProvider

    • まだ 置き換える メタデータ (拡張されない)
    • 追加することもできます TypeDescriptor.AddProvider
    • インスタンスごとだけでなくタイプごとにも適用できるため、実装せずにリストに適用できるようになります。 ITypedList
  • TypeConverter

    • のために PropertyGrid, 、これはメタデータを取得するために使用されるメカニズムでもあります。ご了承ください ExpandableObjectConverter 単に委任するだけです TypeDescriptor.GetProperties, 、ただし常にそうとは限りません
    • 変更を加えて不変オブジェクト (構造体など) を再作成する責任もあります。
  • UITypeEditor

    • のプレビュー ボックスのペイントも担当します。 PropertyGrid

追加:

  • IExtenderProvider - 追加します プロパティ;これがあなたが混乱していたことかもしれません TypeDescriptionProvider
  • ITypedList - 広く言えば双子のこと ICustomTypeDescriptor, 、ただしリストの場合。を使用することで回避できます TypeDescriptionProvider および非オブジェクト インデクサー IList, 、つまり public T this[int index] {get;}
  • IListSource - データソースとデータの間に間接性を提供します。たとえば、 DataTable 実装する IListSource, 、戻る DefaultView 要求されたとき
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top