ICustomTypeDescriptor、TypeDescriptionProvider、TypeConverter、および UITypeEditor
-
09-09-2019 - |
質問
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
要求されたとき
所属していません StackOverflow