XAML 読み込みと依存関係プロパティXAML Loading and Dependency Properties

XAMLXAMLプロセッサの現在WPFWPFの実装は、本質的に依存関係プロパティを認識しています。The current WPFWPF implementation of its XAMLXAML processor is inherently dependency property aware. プロセッサWPFWPFXAMLXAMLは、依存関係プロパティであるバイナリXAMLXAML属性および処理属性を読み込むときに、依存関係プロパティのプロパティ システム メソッドを使用します。The WPFWPF XAMLXAML processor uses property system methods for dependency properties when loading binary XAMLXAML and processing attributes that are dependency properties. これにより、プロパティ ラッパーが事実上バイパスされます。This effectively bypasses the property wrappers. カスタム依存関係プロパティを実装する場合は、この動作を考慮する必要があり、プロパティ システム メソッドおよび プロパティ システム メソッドGetValue以外のSetValue他のコードをプロパティ ラッパーに配置しないようにする必要があります。When you implement custom dependency properties, you must account for this behavior and should avoid placing any other code in your property wrapper other than the property system methods GetValue and SetValue.

必須コンポーネントPrerequisites

このトピックでは、コンシューマーと作成者の両方として依存関係プロパティを理解し、「依存関係プロパティの概要」 および 「カスタム依存関係プロパティ」を参照していることを前提としています。This topic assumes that you understand dependency properties both as consumer and author and have read Dependency Properties Overview and Custom Dependency Properties. XAML の概要 (WPF)XAML 構文の詳細も読んでください。You should also have read XAML Overview (WPF) and XAML Syntax In Detail.

WPF XAML ローダーの実装とパフォーマンスThe WPF XAML Loader Implementation, and Performance

実装上の理由から、プロパティラッパーとそのセッターを使用するのではなく、プロパティを依存関係プロパティとして識別し、SetValueプロパティ システム メソッドにアクセスして設定する方が、計算コストが低くなります。For implementation reasons, it is computationally less expensive to identify a property as a dependency property and access the property system SetValue method to set it, rather than using the property wrapper and its setter. これは、XAMLXAMLプロセッサが、マークアップとさまざまな文字列の構造によって示される型とメンバーの関係を知ることに基づいて、バッキング コードのオブジェクト モデル全体を推論する必要があるためです。This is because a XAMLXAML processor must infer the entire object model of the backing code based only on knowing the type and member relationships that are indicated by the structure of the markup and various strings.

型は xmlns とアセンブリ属性の組み合わせを通じて検索されますが、メンバーを識別し、属性として設定できるメンバーを特定し、プロパティ値がサポートする型を解決するには、 を使用PropertyInfoして広範なリフレクションが必要になります。The type is looked up through a combination of xmlns and assembly attributes, but identifying the members, determining which could support being set as an attribute, and resolving what types the property values support would otherwise require extensive reflection using PropertyInfo. 特定の型の依存関係プロパティは、プロパティ システムを通じてストレージ テーブルとしてアクセスWPFWPFできるため、XAMLXAMLプロセッサの実装はこのテーブルを使用し、依存プロパティ識別子ABCPropertyを使用して、格納元SetValueDependencyObjectの派生型を呼び出すことによって、任意のプロパティABCをより効率的に設定できると推測します。Because dependency properties on a given type are accessible as a storage table through the property system, the WPFWPF implementation of its XAMLXAML processor uses this table and infers that any given property ABC can be more efficiently set by calling SetValue on the containing DependencyObject derived type, using the dependency property identifier ABCProperty.

カスタム依存関係プロパティへの影響Implications for Custom Dependency Properties

プロパティ設定のWPFWPFプロセッサ動作のXAMLXAML現在の実装ではラッパーが完全にバイパスされるため、カスタム依存関係プロパティのラッパーのセット定義に追加のロジックを追加しないでください。Because the current WPFWPF implementation of the XAMLXAML processor behavior for property setting bypasses the wrappers entirely, you should not put any additional logic into the set definitions of the wrapper for your custom dependency property. このようなロジックをセット定義に入れると、コードではなくプロパティが設定XAMLXAMLされたときにロジックは実行されません。If you put such logic in the set definition, then the logic will not be executed when the property is set in XAMLXAML rather than in code.

同様に、プロセッサの他XAMLXAMLの側面では、ラッパーをXAMLXAML使用GetValueするのではなく、処理からプロパティ値を取得します。Similarly, other aspects of the XAMLXAML processor that obtain property values from XAMLXAML processing also use GetValue rather than using the wrapper. したがって、呼び出しを超えて定義にget追加の実装GetValueを避ける必要があります。Therefore, you should also avoid any additional implementation in the get definition beyond the GetValue call.

次の例は、ラッパーを持つ推奨される依存関係プロパティ定義で、プロパティ識別子がpublic``static``readonlyフィールドとして格納され、getおよびsetの定義には、依存関係プロパティのバッキングを定義する必要なプロパティ システム メソッド以外のコードが含まれていません。The following example is a recommended dependency property definition with wrappers, where the property identifier is stored as a public static readonly field, and the get and set definitions contain no code beyond the necessary property system methods that define the dependency property backing.


public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);
public Uri AquariumGraphic
{
  get { return (Uri)GetValue(AquariumGraphicProperty); }
  set { SetValue(AquariumGraphicProperty, value); }
}

Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))
Public Property AquariumGraphic() As Uri
    Get
        Return CType(GetValue(AquariumGraphicProperty), Uri)
    End Get
    Set(ByVal value As Uri)
        SetValue(AquariumGraphicProperty, value)
    End Set
End Property

関連項目See also