dragan10

依存性プロパティ(続き)

2008-10-05 22:52:39

最初に、リフレクターを使ってドキュメントが更新されてないことや、System.Windows.PropertyMetadataのコンストラクタがオーバーロードされていないのがわかるというすばらしいコメントをくれた"obsid" に、心から感謝します。私はリフレクションを使ったプログラム(Programming C# 3.0の第20章をご覧ください)が好きですが、このややぼんやりとしたトピックに深入りしたくない人には、obsidが指摘してくれたことを簡単に確認するには、Visual Studioでオブジェクトブラウザを開いてPropertyMetaDataを検索すれば、こんなふうに見つかるでしょう:


(画像は修正してあります)

ご覧の通り、5つのオーバーロードがあります:デフォルトコンストラクタ、オブジェクトを一つ引数に取るもの、オブジェクトとコールバックを取るもの、4番目にオブジェクトとコールバックと"CoerceValueCallback"を取るもの、そして最後にコールバックを一つ取るだけのコンストラクタです。どれかを選択すれば、オブジェクトブラウザの関連したウィンドウに概要が表示されます。

賢いツールです。

フィードバックについて:フィードバックや訂正はどんどんくださるようにお願いしようと思っていましたが、みなさんはあまり内気ではなさそうですね。この調子でお願いします。デフォルト値に関しては、依存性プロパティの優先順位について書くときに説明しますので、ご承知おきください。

依存性プロパティの利点

前回の議論で、依存性プロパティを使うことの「コスト」、特に学習曲線について説明しました。しかし、明らかにその利点はコストを上回ります。今回から、このビザンチン帝国風システムを使うことで何が得られるのか、説明していきます。

その短い答は、依存性プロパティはプロパティへの4種類の「遅延バインディング」をサポートするために作られた、というものです。これは、プロパティの背後にあるのがただのフィールドでは、サポートしにくいものです。

*リソース

*データバインディング

*スタイルとテンプレート

*アニメーション

もちろん、これらはいずれも別の方法で実現することができますが、依存性プロパティシステムは他のやり方に比べて高速でより効率がよいのです。

依存性プロパティはSilverlightのために生み出されたものではないことに注意してください。依存性プロパティはもともとWPFのためにつくられたもので、Silverlightに応用されたのです。実際、Beta2とRC0の間のソース修正を要する変更点には、Silverlight版の依存性プロパティの足並みをWPF版にそろえるためのものがあります。

  • リソース

リソースは、典型的にはページルート要素あるいはアプリケーション(すなわちApp.xamlの中)の子要素です。

  • データバインディング

データバインディングは、XAMLの拡張マークアップ構文、あるいはコード中のBindingオブジェクトを通じて動作します。データバインディングを使えば、最終的なプロパティの値は実行前には決定されず、実行されて始めてデータソースから取得されます。

  • スタイルとテンプレート

コントロールのプロパティはどれでも、スタイルやテンプレートを使えば元の値を変えることができます。また、実行時に動的に値を変えることも可能です。

  • アニメーション

アニメーションはストーリーボードを使って実装できます。ストーリーボードでは、コントールのプロパティがアニメーションの対象になります。プロパティの値は、非常に頻繁に変更できなければなりません。

これらはすべて、これまでの.NETでもリフレクションを使って実現することができましたが、リフレクションの処理は時間がかかることで有名であり、データバインディングに使えるほど早くはありませんし、アニメーションについては言うまでもありません。

 

アタッチド・プロパティ

依存性プロパティの特に有名で強力な使用例といえば、アタッチドプロパティの生成でしょう-あるオブジェクトのプロパティだと思っていたのが、実は他の(典型的にはそのオブジェクトを含んでいる)オブジェクトのプロパティだった、というものです。たとえば、Textblockが次のように宣言されているとします。

<Textblock text="Who put me here?" grid.Column="1" Grid.Row="0" x:Name="myTB" />

Grid.ColumnとGrid.Rowプロパティは、TextBlockのプロパティではなく、アタッチドプロパティという依存性プロパティの一種を利用して、TextBlockにアタッチされているのです。

優先順位

データバインディングやアニメーションにとって依存性プロパティが非常に有効なのは、一つ以上のソースが潜在的に依存性プロパティの値の決定にかかわる場合(つまり、プロパティはデータバインドやスタイルやアニメーションに影響されて決まったりするということです。さて子の場合、実際に値を決定づけるのはどれでしょう?)の優先順位が非常にうまく整備されているからです。

この続きはまた次回に。

読んでくれてありがとう!

-jesse

 


※このエントリは ブロガーにより投稿されたものです。朝日インタラクティブ および ZDNet Japan編集部の見解・意向を示すものではありません。
  • 新着記事
  • 特集
  • ブログ
このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]