メモ帳ブログ @ wiki
依存プロパティ
最終更新:
nina_a
-
view
依存プロパティ(Dependency Property)
依存プロパティを使う
依存プロパティを使うには,定義と登録を行うとともに,それをラップするプロパティを作成する.
定義は以下の通り.DependencyPropertyNameにはプロパティ名(たとえばMargin)の末尾にPropertyをつけたものにすると良い.
定義は以下の通り.DependencyPropertyNameにはプロパティ名(たとえばMargin)の末尾にPropertyをつけたものにすると良い.
- public class ClassName : SuperClass
- {
- ...
-
- public static readonly DependencyProperty 【DependencyPropertyName】;
-
- ...
- }
登録は以下の通り.静的コンストラクタで登録を行っている.
- static ClassName()
- {
- ...
-
- // 1. この依存プロパティで利用したいサービスを指定するFrameworkPropertyMetadataを作成
- // 引数はMSDN参照 http://msdn.microsoft.com/ja-jp/library
- // /system.windows.frameworkpropertymetadata.frameworkpropertymetadata(v=VS.80).aspx
- FramrworkPropertyMetadata meta = new FrameworkPropertyMetadata( ... );
-
- // 2. 依存プロパティを登録
- 【DependencyPropertyName】 = DependencyProperty.Register(
- "【PropertyName】", 【PropertyType】, 【このプロパティを所有する型】,
- 【1.のFrameworkPropertyMetadata(オプション)】,
- 【値を検証するコールバック(オプション)】);
-
- ...
- }
ラップするプロパティはこんな感じ.というかこれ以外はすべきでないっぽい.
- public 【PropertyType】 【PropertyName】
- {
- set { SetValue(【DependencyPropertyName】, value); }
- get { return (【PropertyType】) GetValue(【DependencyPropertyName】) }
- }
FrameworkPropertyMetadata
詳細は
MSDN
で.フラグのプロパティのデフォルト値は全て偽.
| FrameworkPropertyMetadataのプロパティ | 説明 |
| AffectsArrange, AffectsMeasure, AffectsParentArrange, AffectsParentMeasure | このプロパティが配置パス(あるいは測定パス,親要素の配置パス,測定パス)に影響を与えるかどうか |
| AffectsRender | (プロパティが配置や測定に影響を与えない) 何らかの方法でレイアウト全体に影響を及ぼす可能性があるかどうか |
| BindsTwoWayByDefault | 真ならプロパティの既定のバインドを双方向にする |
| CoerceValueCallback | CoerceValueCallback 実装への参照を取得・設定 |
| DefaultUpdateSourceTrigger | - |
| DefaultValue | プロパティの既定値 |
| Inherits | プロパティ値が継承されるかどうか |
| IsAnimationProhibited | 真ならアニメーション中は無効 |
| IsNotDataBindable | データバインディングをサポートしているかどうか |
| Journal | 真なら,ページベースのアプリケーションで値を保存する |
| OverridesInheritanceBehavior | 要素の論理ツリー内の特定のコンテンツ境界にまたがってプロパティ値の継承を評価するかどうか(?) |
| PropertyChangedCallback | 値が変わったときのコールバック |
| SubPropertiesDoNotAffectRender | サブプロパティがレンダーに影響するか(真ならサブプロパティの値が変わっても再描画されない) |
値の設定,変更にともなう検証
DependencyPropertyではセッタで値の検証を行わず(行えず),ValidateValueCallbackとCoerceValueCallbackを使う.実行順序は
- CoerceValueCallbackで値を変更する機会が与えられる
- ValidateValueCallbackで正しい値か検証する
- PropertyChangedCallbackが実行される
ValidateValueCallback
新しい値を受け取るか拒否するか決定する.DependencyProperty.Registerの引数で指定する.
- delegate bool ValidateValueCallback (
- Object value
- )
CoerceValueCallback
新しい値を受け入れることの出来る値に変える.FrameworkPropertyMetadata.CoerceValueCallbackで指定する.
- delegate Object CoerceValueCallback (
- DependencyObject d,
- Object baseValue
- )
カテゴリ:WPF
