アットウィキロゴ
メモ帳ブログ @ wiki
掲示板 掲示板 ページ検索 ページ検索 メニュー メニュー

メモ帳ブログ @ wiki

依存プロパティ

最終更新:

nina_a

- view
管理者のみ編集可

依存プロパティ(Dependency Property)


依存プロパティを使う

依存プロパティを使うには,定義と登録を行うとともに,それをラップするプロパティを作成する.
定義は以下の通り.DependencyPropertyNameにはプロパティ名(たとえばMargin)の末尾にPropertyをつけたものにすると良い.
  1. public class ClassName : SuperClass
  2. {
  3. ...
  4.  
  5. public static readonly DependencyProperty 【DependencyPropertyName】;
  6.  
  7. ...
  8. }

登録は以下の通り.静的コンストラクタで登録を行っている.
  1. static ClassName()
  2. {
  3. ...
  4.  
  5. // 1. この依存プロパティで利用したいサービスを指定するFrameworkPropertyMetadataを作成
  6. // 引数はMSDN参照 http://msdn.microsoft.com/ja-jp/library
  7. // /system.windows.frameworkpropertymetadata.frameworkpropertymetadata(v=VS.80).aspx
  8. FramrworkPropertyMetadata meta = new FrameworkPropertyMetadata( ... );
  9.  
  10. // 2. 依存プロパティを登録
  11. 【DependencyPropertyName】 = DependencyProperty.Register(
  12. "【PropertyName】", 【PropertyType】, 【このプロパティを所有する型】,
  13. 1.のFrameworkPropertyMetadata(オプション)】,
  14. 【値を検証するコールバック(オプション)】);
  15.  
  16. ...
  17. }

ラップするプロパティはこんな感じ.というかこれ以外はすべきでないっぽい.
  1. public 【PropertyType】 【PropertyName】
  2. {
  3. set { SetValue(【DependencyPropertyName】, value); }
  4. get { return (【PropertyType】) GetValue(【DependencyPropertyName】) }
  5. }

FrameworkPropertyMetadata


詳細は MSDN で.フラグのプロパティのデフォルト値は全て偽.

FrameworkPropertyMetadataのプロパティ 説明
AffectsArrange, AffectsMeasure, AffectsParentArrange, AffectsParentMeasure このプロパティが配置パス(あるいは測定パス,親要素の配置パス,測定パス)に影響を与えるかどうか
AffectsRender (プロパティが配置や測定に影響を与えない) 何らかの方法でレイアウト全体に影響を及ぼす可能性があるかどうか
BindsTwoWayByDefault 真ならプロパティの既定のバインドを双方向にする
CoerceValueCallback CoerceValueCallback 実装への参照を取得・設定
DefaultUpdateSourceTrigger -
DefaultValue プロパティの既定値
Inherits プロパティ値が継承されるかどうか
IsAnimationProhibited 真ならアニメーション中は無効
IsNotDataBindable データバインディングをサポートしているかどうか
Journal 真なら,ページベースのアプリケーションで値を保存する
OverridesInheritanceBehavior 要素の論理ツリー内の特定のコンテンツ境界にまたがってプロパティ値の継承を評価するかどうか(?)
PropertyChangedCallback 値が変わったときのコールバック
SubPropertiesDoNotAffectRender サブプロパティがレンダーに影響するか(真ならサブプロパティの値が変わっても再描画されない)

値の設定,変更にともなう検証

DependencyPropertyではセッタで値の検証を行わず(行えず),ValidateValueCallbackとCoerceValueCallbackを使う.実行順序は
  1. CoerceValueCallbackで値を変更する機会が与えられる
  2. ValidateValueCallbackで正しい値か検証する
  3. PropertyChangedCallbackが実行される

ValidateValueCallback

新しい値を受け取るか拒否するか決定する.DependencyProperty.Registerの引数で指定する.
  1. delegate bool ValidateValueCallback (
  2. Object value
  3. )

CoerceValueCallback

新しい値を受け入れることの出来る値に変える.FrameworkPropertyMetadata.CoerceValueCallbackで指定する.
  1. delegate Object CoerceValueCallback (
  2. DependencyObject d,
  3. Object baseValue
  4. )




カテゴリ:WPF







記事メニュー
最近更新されたスレッド
ウィキ募集バナー