web-dev-qa-db-ja.com

DependencyProperty.Register()または.RegisterAttached()

.Register()の代わりにRegisterAttached()を使用する必要がある場合、2つの違いは何ですか?

39
Sander Rijken

DependencyProperty.RegisterとDependencyProperty.RegisterAttachedを意味していると思います。

DependencyProperty.Registerは、通常のDependencyPropertyを登録するために使用されます。これらは、WPFのDataBinding、アニメーションなどに参加できるというひねりを加えた、単なる通常のプロパティとして見ることができます。実際、これらは、型指定されていないDependencyObject.SetValueの上に(getおよびsetアクセサーを使用して)通常のプロパティとして公開されます。/GetValue。あなたはそれらをあなたのタイプの一部として宣言します。

一方、添付プロパティは異なります。それらは拡張性システムとして意図されています。 Windowsフォームでエクステンダーを使用したことがある場合、それらは似たようなものです。それらをタイプの一部として宣言し、別のタイプで使用できるようにします。

レイアウト関連の情報によく使われます。たとえば、Canvasには左/上座標が必要であり、Gridには行と列が必要であり、DockPanelにはDock情報が必要です。これらすべてを、レイアウト可能なすべてのコントロールで宣言する必要があるとしたら、混乱します。したがって、それらは対応するパネルで宣言されますが、任意のコントロールで使用されます。

必要に応じて、同じことを使用してDependencyObjectに情報を添付できます。たとえば、既存のクラスのスタイルで後で使用するために、xamlで設定できる情報を宣言するだけで便利です。

したがって、これら2種類のDependencyPropertyは、非常に異なる目的を果たします。通常のプロパティ(Register()を介して登録)は、タイプのインターフェイスの一部として通常のプロパティと同じように使用されます。アタッチされたプロパティ(RegisterAttached()を介して登録)は、既存のクラスの拡張ポイントとして使用されます。

それが少し明確になることを願っています。

50
Denis Troller

DependencyProperty.Register()とDependencyProperty.RegisterAttached()の違いは、.Register()を使用してDependencyObjectに「通常の」依存関係プロパティを登録するのに対し、.RegisterAttached()を使用して「添付」依存関係プロパティを設定することです。

2つのタイプの依存関係プロパティの違いはかなり単純です。通常の依存関係プロパティは、他の.NETプロパティと同じように、特定のDependencyObjectに設定されます。一方、アタッチされたプロパティは、特定のDependencyObject(例:Grid)に関連付けられていますが、完全に別個のDependencyObjectに設定されています。多くの場合、アタッチされたプロパティを定義するDependencyObjectの子です(例:Grid.Row、アタッチされたプロパティが設定されます)。親グリッドの子上)。

添付プロパティの詳細 MSDNにあります

11

RegisterまたはRegisterAttachedのいずれかに登録されたプロパティは、SetValueおよびGetValueを使用して任意のDependencyObjectにアタッチできます。ただし、Registerに登録されているプロパティをownerType以外のタイプのオブジェクトにアタッチすると、そのメタデータは使用されません(デフォルト値を除く)。これは、InheritsやAffectsMeasureなどの属性がこれらのプロパティに対して機能しないことを意味します。添付プロパティのメタデータに関心がある場合は、RegisterAttachedを使用する必要があります。

詳細については、同様の質問に対する私の回答を参照してください。 Silverlightのアタッチされた依存関係プロパティとアタッチされていない依存関係プロパティの違い

3
srgstm