カスタム依存関係プロパティCustom Dependency Properties

このトピックは、Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) アプリケーション開発者およびコンポーネントの作成者が、カスタム依存関係プロパティを作成したくなる理由を説明し、実装手順にくわえ、プロパティのパフォーマンス、使いやすさ、または多用性を向上させることができるいくつかの実装オプションについて説明します。This topic describes the reasons that Windows Presentation Foundation (WPF)Windows Presentation Foundation (WPF) application developers and component authors might want to create custom dependency property, and describes the implementation steps as well as some implementation options that can improve performance, usability, or versatility of the property.

必要条件Prerequisites

このトピックは、WPFWPF クラスの既存の依存関係プロパティのコンシューマーの観点から依存関係プロパティを理解しており、「依存関係プロパティの概要」というトピックを読んでいることを前提としています。This topic assumes that you understand dependency properties from the perspective of a consumer of existing dependency properties on WPFWPF classes, and have read the Dependency Properties Overview topic. このトピックの例に従うには、Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) について理解し、WPFWPF アプリケーションの作成方法に精通している必要があります。In order to follow the examples in this topic, you should also understand Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) and know how to write WPFWPF applications.

依存関係プロパティとはWhat Is a Dependency Property?

それ以外の場合は、共通言語ランタイム (CLR) プロパティを有効にして、スタイル設定、データバインディング、継承、アニメーション、および既定値をサポートすることができます。これは、依存関係プロパティとして実装することによって行います。You can enable what would otherwise be a common language runtime (CLR) property to support styling, data binding, inheritance, animations, and default values by implementing it as a dependency property. 依存関係プロパティは、Register メソッド (または RegisterReadOnly) を呼び出すことによって WPFWPF プロパティシステムに登録され、DependencyProperty 識別子フィールドによってサポートされるプロパティです。Dependency properties are properties that are registered with the WPFWPF property system by calling the Register method (or RegisterReadOnly), and that are backed by a DependencyProperty identifier field. 依存関係プロパティは DependencyObject 型によってのみ使用できますが、WPFWPF クラス階層では非常に高い DependencyObject であるため、WPFWPF で使用できるクラスの大部分は依存関係プロパティをサポートできます。Dependency properties can be used only by DependencyObject types, but DependencyObject is quite high in the WPFWPF class hierarchy, so the majority of classes available in WPFWPF can support dependency properties. 依存関係プロパティの詳細、およびこの SDK での記述に使用される用語と規則の詳細については、「依存関係プロパティの概要」を参照してください。For more information about dependency properties and some of the terminology and conventions used for describing them in this SDK, see Dependency Properties Overview.

依存関係プロパティの例Examples of Dependency Properties

WPFWPF クラスに実装されている依存関係プロパティの例 Text としては、Background プロパティ、Width プロパティ、およびその他の多くのプロパティがあります。Examples of dependency properties that are implemented on WPFWPF classes include the Background property, the Width property, and the Text property, among many others. クラスによって公開される各依存関係プロパティには、その同じクラスで公開される DependencyProperty 型の対応するパブリック静的フィールドがあります。Each dependency property exposed by a class has a corresponding public static field of type DependencyProperty exposed on that same class. これが依存関係プロパティの識別子です。This is the identifier for the dependency property. この識別子は規則を使用して命名されます。依存関係プロパティの名前と文字列 Property がこれに付加されます。The identifier is named using a convention: the name of the dependency property with the string Property appended to it. たとえば、Background プロパティの対応する DependencyProperty 識別子フィールドは BackgroundPropertyです。For example, the corresponding DependencyProperty identifier field for the Background property is BackgroundProperty. 識別子は、登録されたときの依存関係プロパティに関する情報を格納します。この識別子は、後で SetValueの呼び出しなど、依存関係プロパティに関連する他の操作に使用されます。The identifier stores the information about the dependency property as it was registered, and the identifier is then used later for other operations involving the dependency property, such as calling SetValue.

依存関係プロパティの概要」で説明したように、WPFWPF のすべての依存関係プロパティ (ほとんどの添付プロパティを除く) も、"ラッパー" 実装によって CLR プロパティになります。As mentioned in the Dependency Properties Overview, all dependency properties in WPFWPF (except most attached properties) are also CLR properties because of the "wrapper" implementation. そのため、コードから、他の CLR プロパティを使用するのと同じ方法でラッパーを定義する CLR アクセサーを呼び出すことによって、依存関係プロパティを取得または設定できます。Therefore, from code, you can get or set dependency properties by calling CLR accessors that define the wrappers in the same manner that you would use other CLR properties. 確立された依存関係プロパティのコンシューマーは、通常、基になるプロパティシステムへの接続ポイントである DependencyObject メソッド GetValueSetValueを使用しません。As a consumer of established dependency properties, you do not typically use the DependencyObject methods GetValue and SetValue, which are the connection point to the underlying property system. 代わりに、CLR プロパティの既存の実装は、識別子フィールドを適切に使用して、プロパティの get および set ラッパー実装内で GetValueSetValue 呼び出されます。Rather, the existing implementation of the CLR properties will have already called GetValue and SetValue within the get and set wrapper implementations of the property, using the identifier field appropriately. カスタム依存関係プロパティを自分で実装する場合、同様の方法でラッパーを定義します。If you are implementing a custom dependency property yourself, then you will be defining the wrapper in a similar way.

依存関係プロパティを実装すべき状況When Should You Implement a Dependency Property?

クラスにプロパティを実装するときに、クラスが DependencyObjectから派生している限り、DependencyProperty 識別子を使用してプロパティを返すことができるため、依存関係プロパティにすることができます。When you implement a property on a class, so long as your class derives from DependencyObject, you have the option to back your property with a DependencyProperty identifier and thus to make it a dependency property. シナリオのニーズによっては、プロパティを依存関係プロパティにすることが必要ない場合や適切でない場合もあります。Having your property be a dependency property is not always necessary or appropriate, and will depend on your scenario needs. 場合によっては、プロパティをプライベート フィールドでバッキングする一般的な手法で十分な場合もあります。Sometimes, the typical technique of backing your property with a private field is adequate. ただし、プロパティで次の WPFWPF 機能の 1 つ以上をサポートする場合には、常に依存関係プロパティとしてプロパティを実装する必要があります。However, you should implement your property as a dependency property whenever you want your property to support one or more of the following WPFWPF capabilities:

  • プロパティをスタイルで設定可能にする。You want your property to be settable in a style. 詳しくは、「 スタイルとテンプレート」をご覧ください。For more information, see Styling and Templating.

  • プロパティでデータ バインディングをサポートする。You want your property to support data binding. データ バインディングの依存関係プロパティの詳細については、「2 つのコントロールのプロパティをバインドする」を参照してください。For more information about data binding dependency properties, see Bind the Properties of Two Controls.

  • プロパティを動的リソース参照で設定可能にする。You want your property to be settable with a dynamic resource reference. 詳細については、「XAML リソース」を参照してください。For more information, see XAML Resources.

  • 要素ツリーの親要素からプロパティ値を自動的に継承する。You want to inherit a property value automatically from a parent element in the element tree. この場合は、CLR アクセス用のプロパティラッパーも作成する場合でも、RegisterAttached メソッドに登録します。In this case, register with the RegisterAttached method, even if you also create a property wrapper for CLR access. 詳細については、「プロパティ値の継承」を参照してください。For more information, see Property Value Inheritance.

  • プロパティをアニメーション化できるようにする。You want your property to be animatable. 詳しくは、「 アニメーションの概要」をご覧ください。For more information, see Animation Overview.

  • プロパティの前の値が、プロパティ システム、環境、または、ユーザーによって行われたアクションによって変更された場合、または読み取りおよびスタイルの使用によって変更された場合に、プロパティ システムに報告させる。You want the property system to report when the previous value of the property has been changed by actions taken by the property system, the environment, or the user, or by reading and using styles. プロパティのメタデータを使用すると、プロパティ システムがプロパティ値が明らかに変更されたと判断するたびに呼び出されるコールバック メソッドをプロパティで指定できます。By using property metadata, your property can specify a callback method that will be invoked each time the property system determines that your property value was definitively changed. 関連する概念は、プロパティ値の強制型変換です。A related concept is property value coercion. 詳しくは、「依存関係プロパティのコールバックと検証」を参照してください。For more information, see Dependency Property Callbacks and Validation.

  • プロパティ値の変更に、要素のビジュアルを再構成するためのレイアウト システムが必要かどうかを報告するなど、WPFWPF プロセスでも使用されている確立されたメタデータ規則を使用する。You want to use established metadata conventions that are also used by WPFWPF processes, such as reporting whether changing a property value should require the layout system to recompose the visuals for an element. または、派生クラスが既定値などのメタデータに基づく特性を変更できるように、メタデータのオーバーライドを使用できるようする。Or you want to be able to use metadata overrides so that derived classes can change metadata-based characteristics such as the default value.

  • カスタムコントロールのプロパティを使用して、 [プロパティ] ウィンドウの編集など、VISUAL Studio WPF デザイナーのサポートを受ける必要があります。You want properties of a custom control to receive Visual Studio WPF Designer support, such as Properties window editing. 詳細については、「コントロールの作成の概要」を参照してください。For more information, see Control Authoring Overview.

これらのシナリオを検討するときに、完全に新しいプロパティを実装するよりも、既存の依存関係プロパティのメタデータをオーバーライドすることで、シナリオを実現できるかどうかも考慮する必要があります。When you examine these scenarios, you should also consider whether you can achieve your scenario by overriding the metadata of an existing dependency property, rather than implementing a completely new property. メタデータのオーバーライドが実用的かどうかは、シナリオとそのシナリオが既存の WPFWPF 依存関係プロパティとクラスでの実装にどのくらい似ているかによって異なります。Whether a metadata override is practical depends on your scenario and how closely that scenario resembles the implementation in existing WPFWPF dependency properties and classes. 既存のプロパティでメタデータをオーバーライドする方法の詳細については、「依存関係プロパティのメタデータ」を参照してください。For more information about overriding metadata on existing properties, see Dependency Property Metadata.

依存関係プロパティを定義するためのチェックリストChecklist for Defining a Dependency Property

依存関係プロパティの定義は、次の 4 つの異なる概念で構成されます。Defining a dependency property consists of four distinct concepts. これらの概念は、一部は実装で最終的に 1 行のコードとして結合されるため、必ずしも厳密な手順である必要はありません。These concepts are not necessarily strict procedural steps, because some of these end up being combined as single lines of code in the implementation:

  • (省略可能) 依存関係プロパティのプロパティ メタデータを作成します。(Optional) Create property metadata for the dependency property.

  • 所有者型とプロパティ値の型を指定して、プロパティ システムにプロパティ名を登録します。Register the property name with the property system, specifying an owner type and the type of the property value. プロパティのメタデータも指定します (使用している場合)。Also specify the property metadata, if used.

  • 所有者の種類で public static readonly フィールドとして DependencyProperty 識別子を定義します。Define a DependencyProperty identifier as a public static readonly field on the owner type.

  • 依存関係プロパティの名前と一致する名前を持つ CLR "ラッパー" プロパティを定義します。Define a CLR "wrapper" property whose name matches the name of the dependency property. CLR "ラッパー" プロパティの getset アクセサーを実装して、それをバッキングする依存関係プロパティと接続します。Implement the CLR "wrapper" property's get and set accessors to connect with the dependency property that backs it.

プロパティ システムにプロパティを登録するRegistering the Property with the Property System

プロパティを依存関係プロパティにするためには、そのプロパティをプロパティ システムが保持するテーブルに登録し、その後のプロパティ システム操作で修飾子として使用する一意の識別子をプロパティに設定します。In order for your property to be a dependency property, you must register that property into a table maintained by the property system, and give it a unique identifier that is used as the qualifier for later property system operations. これらの操作は、内部操作である場合もあれば、プロパティシステム Api を呼び出す独自のコードである場合もあります。These operations might be internal operations, or your own code calling property system APIs. プロパティを登録するには、クラスの本体 (クラス内では、メンバー定義の外部) で Register メソッドを呼び出します。To register the property, you call the Register method within the body of your class (inside the class, but outside of any member definitions). 識別子フィールドは、戻り値として Register メソッドの呼び出しによっても提供されます。The identifier field is also provided by the Register method call, as the return value. Register 呼び出しが他のメンバー定義の外部で行われる理由は、この戻り値を使用して、クラスの一部として DependencyProperty 型の public static readonly フィールドを割り当てて作成するためです。The reason that the Register call is done outside of other member definitions is because you use this return value to assign and create a public static readonly field of type DependencyProperty as part of your class. このフィールドは、依存関係プロパティの識別子になります。This field becomes the identifier for your dependency property.

public static readonly DependencyProperty AquariumGraphicProperty = DependencyProperty.Register(
  "AquariumGraphic",
  typeof(Uri),
  typeof(AquariumObject),
  new FrameworkPropertyMetadata(null,
      FrameworkPropertyMetadataOptions.AffectsRender, 
      new PropertyChangedCallback(OnUriChanged)
  )
);
Public Shared ReadOnly AquariumGraphicProperty As DependencyProperty = DependencyProperty.Register("AquariumGraphic", GetType(Uri), GetType(AquariumObject), New FrameworkPropertyMetadata(Nothing, FrameworkPropertyMetadataOptions.AffectsRender, New PropertyChangedCallback(AddressOf OnUriChanged)))

依存関係プロパティの命名規則Dependency Property Name Conventions

依存関係プロパティについては、確立されている命名規則があり、例外的な状況を除き、必ず従う必要があります。There are established naming conventions regarding dependency properties that you must follow in all but exceptional circumstances.

依存関係プロパティ自体には、この例のように基本名 "AquariumGraphic" が設定されます。この例は、Registerの最初のパラメーターとして指定されています。The dependency property itself will have a basic name, "AquariumGraphic" as in this example, which is given as the first parameter of Register. この名前は、それぞれの登録型内で一意である必要があります。That name must be unique within each registering type. 基本型から継承された依存関係プロパティは、登録型の一部に既になっていると見なされ、継承されたプロパティの名前は、再度登録することはできません。Dependency properties inherited through base types are considered to be already part of the registering type; names of inherited properties cannot be registered again. しかし、その依存関係プロパティが継承されていない場合でも、依存関係プロパティの所有者としてクラスを追加する方法があります。詳細については、「依存関係プロパティのメタデータ」を参照してください。However, there is a technique for adding a class as owner of a dependency property even when that dependency property is not inherited; for details, see Dependency Property Metadata.

識別子フィールドを作成するときに、登録したプロパティの名前にサフィックス Property を付けて、このフィールドに名前を付けます。When you create the identifier field, name this field by the name of the property as you registered it, plus the suffix Property. このフィールドは依存関係プロパティの識別子で、後で独自のコードによってプロパティにアクセスする他のコードによって、ラッパーに対して実行する SetValue および GetValue 呼び出しの入力として使用されます。は、プロパティシステムによって許可される外部コードアクセス、および XAMLXAML プロセッサによって許可される可能性があります。This field is your identifier for the dependency property, and it will be used later as an input for the SetValue and GetValue calls you will make in the wrappers, by any other code access to the property by your own code, by any external code access you allow, by the property system, and potentially by XAMLXAML processors.

注意

クラス本体で依存関係プロパティを定義することは一般的な実装ですが、クラスの静的コンストラクターで依存関係プロパティを定義することもできます。Defining the dependency property in the class body is the typical implementation, but it is also possible to define a dependency property in the class static constructor. 依存関係プロパティを初期化するために複数行のコードが必要な場合には、このアプローチが適している場合があります。This approach might make sense if you need more than one line of code to initialize the dependency property.

"ラッパー" を実装するImplementing the "Wrapper"

ラッパーの実装では、get の実装で GetValue を呼び出す必要があります。また、set 実装で SetValue します (わかりやすくするために、元の登録呼び出しとフィールドもここに表示されています)。Your wrapper implementation should call GetValue in the get implementation, and SetValue in the set implementation (the original registration call and field are shown here too for clarity).

すべての例外的な状況では、ラッパーの実装では GetValueSetValue のアクションのみを実行する必要があります。In all but exceptional circumstances, your wrapper implementations should perform only the GetValue and SetValue actions, respectively. この理由については、「XAML 読み込みと依存関係プロパティ」のトピックで説明しています。The reason for this is discussed in the topic XAML Loading and Dependency Properties.

WPFWPF クラスで提供されているすべての既存のパブリックな依存関係プロパティは、この単純なラッパー実装モデルを使用します。依存関係プロパティのしくみの複雑さの大部分は、本質的にプロパティ システムの動作であるか、強制変換やプロパティ メタデータを通じたプロパティ変更のコールバックなど、その他の概念を通じて実装されます。All existing public dependency properties that are provided on the WPFWPF classes use this simple wrapper implementation model; most of the complexity of how dependency properties work is either inherently a behavior of the property system, or is implemented through other concepts such as coercion or property change callbacks through property metadata.


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

この場合も、慣例により、ラッパープロパティの名前は、選択した名前と同じである必要があります。また、プロパティを登録した Register 呼び出しの最初のパラメーターとして指定する必要があります。Again, by convention, the name of the wrapper property must be the same as the name chosen and given as first parameter of the Register call that registered the property. プロパティが規則に従っていない場合、すべての可能な使用を無効にする必要はありませんが、次のような注目すべき問題がいくつか発生します。If your property does not follow the convention, this does not necessarily disable all possible uses, but you will encounter several notable issues:

  • スタイルとテンプレートの一部が機能しない。Certain aspects of styles and templates will not work.

  • ほとんどのツールとデザイナーは、適切に XAMLXAML をシリアル化するため、またはプロパティごとのレベルでのデザイナー環境のサポートを提供するために命名規則に依存する必要があります。Most tools and designers must rely on the naming conventions to properly serialize XAMLXAML, or to provide designer environment assistance at a per-property level.

  • WPFWPF XAMLXAML ローダーの現在の実装は、属性値を処理するときに、ラッパーを完全にバイパスして、命名規則に依存しています。The current implementation of the WPFWPF XAMLXAML loader bypasses the wrappers entirely, and relies on the naming convention when processing attribute values. 詳しくは、「XAML 読み込みと依存関係プロパティ」を参照してください。For more information, see XAML Loading and Dependency Properties.

新しい依存関係プロパティのプロパティ メタデータProperty Metadata for a New Dependency Property

依存関係プロパティを登録するときに、プロパティ システムを通じて登録すると、プロパティの特性を格納するメタデータ オブジェクトが作成されます。When you register a dependency property, the registration through the property system creates a metadata object that stores property characteristics. これらの特性の多くには、プロパティが Registerの単純なシグネチャに登録されている場合に設定される既定値があります。Many of these characteristics have defaults that are set if the property is registered with the simple signatures of Register. Register の他の署名では、プロパティを登録するときに必要なメタデータを指定できます。Other signatures of Register allow you to specify the metadata that you want as you register the property. 依存関係プロパティに指定される最も一般的なメタデータは、プロパティを使用する新しいインスタンスに適用される既定値を与えるためのものです。The most common metadata given for dependency properties is to give them a default value that is applied on new instances that use the property.

FrameworkElementの派生クラスに存在する依存関係プロパティを作成する場合は、基本 PropertyMetadata クラスではなく、より特殊化されたメタデータクラス FrameworkPropertyMetadata を使用できます。If you are creating a dependency property that exists on a derived class of FrameworkElement, you can use the more specialized metadata class FrameworkPropertyMetadata rather than the base PropertyMetadata class. FrameworkPropertyMetadata クラスのコンストラクターには、さまざまなメタデータ特性を組み合わせて指定できるいくつかのシグネチャがあります。The constructor for the FrameworkPropertyMetadata class has several signatures where you can specify various metadata characteristics in combination. 既定値のみを指定する場合は、Object型の1つのパラメーターを受け取る署名を使用します。If you want to specify the default value only, use the signature that takes a single parameter of type Object. そのオブジェクトパラメーターは、プロパティの型固有の既定値として渡します (提供される既定値は、Register 呼び出しで propertyType パラメーターとして指定した型である必要があります)。Pass that object parameter as a type-specific default value for your property (the default value provided must be the type you provided as the propertyType parameter in the Register call).

FrameworkPropertyMetadataには、プロパティのメタデータオプションフラグを指定することもできます。For FrameworkPropertyMetadata, you can also specify metadata option flags for your property. これらのフラグは、登録後にプロパティ メタデータで個々のプロパティに変換され、特定の条件をレイアウト エンジンなどの他のプロセスに伝えるために使用されます。These flags are converted into discrete properties on the property metadata after registration and are used to communicate certain conditionals to other processes such as the layout engine.

適切なメタデータ フラグの設定Setting Appropriate Metadata Flags

  • プロパティ (またはその値の変更) が ユーザー インターフェイス (UI)user interface (UI)に影響を与える場合、特に、レイアウトシステムがページ内の要素のサイズを設定または表示する方法に影響を与える場合は、次のフラグを1つ以上設定します: AffectsMeasureAffectsArrangeAffectsRenderIf your property (or changes in its value) affects the ユーザー インターフェイス (UI)user interface (UI), and in particular affects how the layout system should size or render your element in a page, set one or more of the following flags: AffectsMeasure, AffectsArrange, AffectsRender.

    • AffectsMeasure は、このプロパティに対する変更によって、親オブジェクトが親内で必要になる可能性のある領域が含まれている場合に、UIUI レンダリングを変更する必要があることを示します。AffectsMeasure indicates that a change to this property requires a change to UIUI rendering where the containing object might require more or less space within the parent. たとえば、"Width" プロパティには、このフラグが設定されている必要があります。For example, a "Width" property should have this flag set.

    • AffectsArrange は、このプロパティへの変更によって、通常は専用の領域を変更する必要がないが、スペース内の位置が変更されたことを示す UIUI のレンダリングを変更する必要があることを示します。AffectsArrange indicates that a change to this property requires a change to UIUI rendering that typically does not require a change in the dedicated space, but does indicate that the positioning within the space has changed. たとえば、"Alignment" プロパティには、このフラグが設定されている必要があります。For example, an "Alignment" property should have this flag set.

    • AffectsRender は、レイアウトや測定に影響を与えずに、別のレンダリングが必要な他の変更が発生したことを示します。AffectsRender indicates that some other change has occurred that will not affect layout and measure, but does require another render. "Background" など、既存の要素の色を変更するプロパティはその一例です。An example would be a property that changes a color of an existing element, such as "Background".

    • これらのフラグは、プロパティ システムやレイアウトのコールバックの独自のオーバーライド実装のためのメタデータのプロトコルとしてよく使用されます。These flags are often used as a protocol in metadata for your own override implementations of property system or layout callbacks. たとえば、インスタンスのいずれかのプロパティが値の変更を報告し、そのメタデータで true として AffectsArrange た場合、InvalidateArrange を呼び出す OnPropertyChanged コールバックがあるとします。For instance, you might have an OnPropertyChanged callback that will call InvalidateArrange if any property of the instance reports a value change and has AffectsArrange as true in its metadata.

  • 上記で説明した必要なサイズを変更する方法に加え、一部のプロパティは含まれる親要素のレンダリング特性に影響する場合があります。Some properties may affect the rendering characteristics of the containing parent element, in ways above and beyond the changes in required size mentioned above. 例として、フロードキュメントモデルで使用される MinOrphanLines プロパティがあります。このプロパティを変更すると、その段落を含むフロードキュメントの全体的なレンダリングを変更できます。An example is the MinOrphanLines property used in the flow document model, where changes to that property can change the overall rendering of the flow document that contains the paragraph. AffectsParentArrange または AffectsParentMeasure を使用して、独自のプロパティで類似したケースを特定します。Use AffectsParentArrange or AffectsParentMeasure to identify similar cases in your own properties.

  • 既定では、依存関係プロパティはデータ バインディングをサポートします。By default, dependency properties support data binding. データ バインディングにとって現実的なシナリオがない場合や、大きなオブジェクトのデータ バインディングのパフォーマンスが問題として認識される場合には、意図的にデータ バインディングを無効にすることができます。You can deliberately disable data binding, for cases where there is no realistic scenario for data binding, or where performance in data binding for a large object is recognized as a problem.

  • 既定では、依存関係プロパティのデータバインディング Mode は既定で OneWayに設定されています。By default, data binding Mode for dependency properties defaults to OneWay. バインドは、バインドインスタンスごとに TwoWay するようにいつでも変更できます。詳細については、「バインディングの方向を指定する」を参照してください。You can always change the binding to be TwoWay per binding instance; for details, see Specify the Direction of the Binding. ただし、依存関係プロパティの作成者は、プロパティが既定で TwoWay バインドモードを使用するように選択できます。But as the dependency property author, you can choose to make the property use TwoWay binding mode by default. 既存の依存関係プロパティの例としては、MenuItem.IsSubmenuOpenがあります。このプロパティのシナリオでは、IsSubmenuOpen 設定ロジックと MenuItem の合成が既定のテーマスタイルと対話します。An example of an existing dependency property is MenuItem.IsSubmenuOpen; the scenario for this property is that the IsSubmenuOpen setting logic and the compositing of MenuItem interact with the default theme style. IsSubmenuOpen プロパティロジックは、データバインディングをネイティブに使用して、他の状態プロパティやメソッド呼び出しに従ってプロパティの状態を維持します。The IsSubmenuOpen property logic uses data binding natively to maintain the state of the property in accordance to other state properties and method calls. 既定で TwoWay をバインドするもう1つのプロパティの例は TextBox.Textです。Another example property that binds TwoWay by default is TextBox.Text.

  • Inherits フラグを設定することによって、カスタム依存関係プロパティでプロパティの継承を有効にすることもできます。You can also enable property inheritance in a custom dependency property by setting the Inherits flag. プロパティの継承は、親要素と子要素に共通のプロパティがあるシナリオに便利で、子要素に、親に設定されたのと同じ値に設定した特定のプロパティ値を持たせることは理にかなっています。Property inheritance is useful for a scenario where parent elements and child elements have a property in common, and it makes sense for the child elements to have that particular property value set to the same value as the parent set it. 継承可能なプロパティの例として DataContextがあります。これは、データ表示の重要なマスター詳細シナリオを有効にするためにバインド操作に使用されます。An example inheritable property is DataContext, which is used for binding operations to enable the important master-detail scenario for data presentation. DataContext 継承可能にすることで、すべての子要素もそのデータコンテキストを継承します。By making DataContext inheritable, any child elements inherit that data context also. プロパティ値の継承により、ページまたはアプリケーションのルートでデータ コンテキストを指定できます。すべての使用可能な子要素内のバインディングに再度指定する必要はありません。Because of property value inheritance, you can specify a data context at the page or application root, and do not need to respecify it for bindings in all possible child elements. また DataContext は、継承によって既定値がオーバーライドされることを示す良い例でもありますが、常に特定の子要素でローカルに設定することができます。詳細については、「階層データでマスター詳細パターンを使用する」を参照してください。DataContext is also a good example to illustrate that inheritance overrides the default value, but it can always be set locally on any particular child element; for details, see Use the Master-Detail Pattern with Hierarchical Data. プロパティ値の継承にはパフォーマンスが低下する可能性があるため、控え目に使用する必要があります。詳細については、「プロパティ値の継承」を参照してください。Property value inheritance does have a possible performance cost, and thus should be used sparingly; for details, see Property Value Inheritance.

  • Journal フラグを設定して、ナビゲーションジャーナリングサービスで依存関係プロパティを検出または使用する必要があるかどうかを示します。Set the Journal flag to indicate if your dependency property should be detected or used by navigation journaling services. 例として、SelectedIndex プロパティがあります。選択コントロールで選択された項目は、履歴履歴がナビゲートされるときに保持される必要があります。An example is the SelectedIndex property; any item selected in a selection control should be persisted when the journaling history is navigated.

読み取り専用の依存関係プロパティRead-Only Dependency Properties

読み取り専用の依存関係プロパティを定義することができます。You can define a dependency property that is read-only. ただし、読み取り専用としてプロパティを定義する理由のシナリオには、プロパティ システムに登録して、識別子を公開するための手順が異なるため、若干の違いがあります。However, the scenarios for why you might define your property as read-only are somewhat different, as is the procedure for registering them with the property system and exposing the identifier. 詳細については、「読み取り専用の依存関係プロパティ」を参照してください。For more information, see Read-Only Dependency Properties.

コレクション型依存関係プロパティCollection-Type Dependency Properties

コレクション型依存関係プロパティには、考慮すべき実装問題が他にもいくつかあります。Collection-type dependency properties have some additional implementation issues to consider. 詳細については、「コレクション型依存関係プロパティ」を参照してください。For details, see Collection-Type Dependency Properties.

依存関係プロパティのセキュリティに関する考慮事項Dependency Property Security Considerations

依存関係プロパティは、パブリック プロパティとして宣言する必要があります。Dependency properties should be declared as public properties. 依存関係プロパティ識別子フィールドは、パブリック静的フィールドとして宣言する必要があります。Dependency property identifier fields should be declared as public static fields. 他のアクセスレベル (protected など) を宣言しようとしても、依存関係プロパティは、プロパティシステム Api と組み合わせて、識別子を使用していつでもアクセスできます。Even if you attempt to declare other access levels (such as protected), a dependency property can always be accessed through the identifier in combination with the property system APIs. メタデータレポートや、プロパティシステムの一部である値の決定 Api (LocalValueEnumeratorなど) が原因で、保護された識別子フィールドにアクセスできる可能性もあります。Even a protected identifier field is potentially accessible because of metadata reporting or value determination APIs that are part of the property system, such as LocalValueEnumerator. 詳細については、「依存関係プロパティのセキュリティ」を参照してください。For more information, see Dependency Property Security.

依存関係プロパティとクラス コンストラクターDependency Properties and Class Constructors

マネージド コード プログラミングでは、クラス コンストラクターが仮想メソッドを呼び出さないという一般的な方針があります (多くの場合は FxCop などのコード分析ツールによって適用されます)。There is a general principle in managed code programming (often enforced by code analysis tools such as FxCop) that class constructors should not call virtual methods. これは、派生クラスのコンストラクターの基本の初期化としてコンストラクターを呼び出すことができ、コンストラクターから仮想メソッドを入力することで、構築されるオブジェクトのインスタンスの初期化が不完全な状態で行われる可能性があるためです。This is because constructors can be called as base initialization of a derived class constructor, and entering the virtual method through the constructor might occur at an incomplete initialization state of the object instance being constructed. DependencyObjectから派生したクラスから派生する場合は、プロパティシステム自体がを呼び出し、仮想メソッドを内部的に公開していることに注意してください。When you derive from any class that already derives from DependencyObject, you should be aware that the property system itself calls and exposes virtual methods internally. これらの仮想メソッドは、WPFWPF プロパティ システム サービスの一部です。These virtual methods are part of the WPFWPF property system services. メソッドをオーバーライドすることで、派生クラスが値の決定に参加できるようになります。Overriding the methods enables derived classes to participate in value determination. ランタイムの初期化の潜在的な問題を回避するには、非常に特殊なコンストラクター パターンに従っている場合を除き、依存関係プロパティの値をクラスのコンストラクター内で設定しないでください。To avoid potential issues with runtime initialization, you should not set dependency property values within constructors of classes, unless you follow a very specific constructor pattern. 詳細については、「DependencyObject の安全なコンストラクター パターン」を参照してください。For details, see Safe Constructor Patterns for DependencyObjects.

関連項目See also