PropertyGridコントロールのWPF「マジック」
-
10-07-2019 - |
質問
WPFについて学ぶために趣味のプロジェクトを開始しましたが、私の調査でこのWPF PropertyGrid http:// www.codeplex.com/wpg
http://wpg.codeplex.com/SourceControl/ListDownloadableCommitsからソースをダウンロードしました。 aspx 、そしてそれを閲覧し始め、かっこよく見え、動作します。しかし、私の人生では、それがどのように機能するのかわかりません。次の質問は、一見したところです。
- どのようにオブジェクトがどのプロパティを持っているかを知るのですか?
- コントロールをレンダリングして値を編集する方法
- どのコントロールをレンダリングするかをどのように決定しますか? (プロパティのメタデータの説明を推測しています)
DependancyPropertiesが新しい値間のデータ交換を処理することを理解しています。
- すべての魔法を行うXAMLまたはCodeBehindコードはどこにありますか?
Default.xamlファイルには多くのXAMLコードがありますが、私が知る限り、そこに定義されているのはスタイルと外観だけです。
解決
- どのようにオブジェクトがどのプロパティを持っているかを知るのですか?
System.ComponentModel.TypeDescriptor
を使用して、 TypeDescriptor.GetProperties
。 PropertyDescriptor
は、各プロパティに関する豊富な情報(例: PropertyDescriptor.IsReadOnly
は、プロパティが読み取り専用であることを通知します)。さらに、 PropertyDescriptor.GetValue
および PropertyDescriptor.SetValue
、プロパティの値を取得して書き込むことができます。
- コントロールをレンダリングして値を編集する方法
- どのコントロールをレンダリングするかをどのように決定しますか? (プロパティのメタデータの説明を推測しています)
アイテム
の ObservableCollection
。 Item
は、コアモデルオブジェクトの基本クラスであり、 Property
です。 Property
は、プロパティの基になる型( PropertyDescritor.PropertyType
)を公開し、 PropertyDescriptor.GetValue
および PropertyDescriptor.SetValue
Property.Value
を介したメソッド。これが、編集を可能にするためにバインドされているものです。 DataTemplate
s はここの鍵。いくつかのCLR型には、表示されるコントロールをレンダリングするカスタム DataTemplate
があります。たとえば、 Boolean
タイプは CheckBox
としてレンダリングされ、 Enum
は ComboBox
としてレンダリングされます。デフォルトの DataTemplate
は TextBox
です。
- すべての魔法を行うXAMLまたはCodeBehindコードはどこにありますか?
その傾向は Themes \ Default.xaml
にあります。
コードはこのように要約できます。オブジェクトのプロパティに関する情報をカプセル化し、プロパティの値を読み書きするプロパティ( Property.Value
)を提供するデータ( Data \ Property
)があります。このデータは、 Themes \ Default.xamlの
。 DataTemplate
sを使用してレンダリングされるカスタムコントロール( PropertyGrid
)の ObservableCollection
として公開されます。
Default.xamlファイルには多くのXAMLコードがありますが、私が知る限り、そこに定義されているのはスタイルと外観だけです。
DataTemplate
を見落とさないでください。
他のヒント
- どのようにオブジェクトがどのプロパティを持っているかを知るのですか?
Windows Formsプロパティグリッドと同じように機能する場合、以下を実行します。
- オブジェクトがICustomTypeDescriptorを実装する場合、このインターフェイスからプロパティを取得します(GetPropertiesメソッドを使用)
- それ以外の場合は、オブジェクトのタイプのリフレクションを使用します(obj.GetType()。GetProperties()
他の質問については...まあ、私はコードを見ていないので、答えられません;)