‫お帰りなさい｡
‫このビデオでは､ 依存性プロパティについて説明します｡ 依存性プロパティは､ データバインディングに入るとすぐに､
‫超重要なものになります｡
‫そして一般的には､ その仕組みを理解することに意味があるのです｡
‫それでは､ グリッドの中にボタンを作ってみましょう｡
‫そして､ すでに何度も見てきたように､ ボタンキーワードを作ることでそれを実現するのです｡
‫そしてここでは､ 高さを仮に100ピクセル､ 幅を200ピクセルとし､ Click Meというコンテンツを割り当てることにします｡
‫そして､ 今度は背景というものを使ってみたいと思います｡
‫そこで､ backgroundというプロパティがあるので､ それを確実に下水道に割り当てたいのです｡
‫だから､ それが私のボタンになるんです｡
‫そして､ 今見ていただいたように､ ちょうどノコギリ色になっています｡
‫赤にしたほうがいいんじゃない？
‫よし､ 赤だ｡
‫結構､ 強いんですよ｡
‫ヴァイオレットレッド
‫いい感じですね｡
‫だから､ シンプルな色｡
‫そこで､ 依存性プロパティとは何か､ どこにあるのか､ そして､ 独自の依存性プロパティを作成する方法について説明して行きたいと思います｡
‫そして､ それをボタンで行うのは､ 言ってみればかなり簡単なことです｡
‫ところで､ このボタンですが､ 実はこのボタンをスタイル付けしたいので､ このまま閉じます｡
‫そこで､ ボタンタグの中で､ そのボタンにさらにスタイルを追加したいのですが､ そのスタイルはトリガーである必要があります｡
‫だから､ トリガーしたいんです｡
‫だから､ ボタンの部分に入ったら､ 色とかを変えたいんです｡
‫ということで､ ボタン・ドット・スタイルを使ってみます｡
‫ボタンのスタイルにはここにスタイルが必要なので､ ここに独自のスタイルを作成し､ そのスタイルにターゲットを設定することにします｡
‫ターゲットタイプはボタンになる予定です｡
‫さて､ これだけでは不十分です｡ 今度はこのスタイルにトリガーを追加したいと思います｡
‫そこで､ スタイルトリガーを使ってみることにします｡
‫このように｡
‫そして､ イベントが発生したときに実行される美しい小さなトリガーを作成することができるようになりました｡
‫そして､ すでにイベントを見ていますが､ それは少し違うイベントです｡
‫つまり､ 以下のように使えるトリガーなのです｡
‫ここでトリガーを作成し､ そのトリガーがプロパティを持つようにすることができます｡
‫そして､ その1つが､ 例えばマウスオーバーです｡
‫つまり､ マウスがそのボタンの上に乗ったら､ その値をtrueに設定する必要があります｡
‫そして､ そのトリガーには､ セッターが必要です｡
‫では､ そうなった場合､ どうすればよいのでしょうか｡
‫そこで､ フォントサイズのプロパティを30に設定します｡
‫ここでは､ 特定の幅と内容､ そして幅を持つボタンがあります｡
‫そして､ パイロットにしたのは､ 淡いバイオレットレッド｡
‫そして､ そのボタンにスタイルを追加しました｡
‫そして､ 追加したあのスタイルは､ 実はトリガーなんです｡
‫スタイルトリガーと呼ばれる､ スタイル変更のトリガーとなるものがあります｡
‫これは､ マウスをボタンの上に置くとトリガーが実行され､ それが物事を設定するものです｡
‫つまり､ フォントサイズを今ここで指定した値に設定するのです｡
‫ここでは､ 値を代入する｡
‫Trueは､ このマウスオーバーがTrueになった時点でトリガーされることを意味します｡
‫そして､ それはマウスにカーソルを合わせても､ ボタンにマウスを合わせても同じことです｡
‫だから､ それを実行すれば､ 何らかの変化が見られるはずです｡
‫そして､ これはホバー機能を持つだけのかなり長いアプローチですが､ ここで使いたいのはもっとたくさんあるのです｡
‫それで､ ほら､ カーソルを合わせると､ このように青みがかった色に変わるんです｡
‫そして､ その時に大きく表示されるのが､ この文字です｡
‫だから､ 値が30に変わる｡
‫だから､ それは素晴らしいことであり､ すべてです｡
‫しかし､ なぜこのような長いコードが必要なのでしょうか？
‫まあ､ ここでプロパティを使っているのがミソなんですけどね｡
‫ご覧のように､ これはプロパティと呼ばれるもので､ 実際には幅はプロパティ､
‫内容はプロパティ､ 背景はプロパティで､ これらは依存プロパティに依存しているか､ 依存プロパティに接続されており､
‫データバインディングのために重要な役割を担っています｡
‫次のビデオで説明しますが､ このトリガーイベント､ つまりボタンが何が起こっているかを認識することも重要です｡
‫それでは､ メインウィンドウのメソッドの中にボタンを作ってみましょう｡
‫ただ､ ボタンを作るだけなので､ 今度はクラスそのものを確認したいと思います｡
‫だから､ F 12を押すだけで定義に移動できるように､ 定義に移動します｡
‫そして､ これはボタンのクラスを表示するものです｡
‫そして､ ご覧の通り､ ボタン系を継承したクラスです｡
‫静的な読み取り専用の依存プロパティがあり､ これはデフォルトプロパティがキャンセルされ､ プロパティはデフォルトプロパティとなります｡
‫だから､ あまり無理はしない｡
‫しかし､ 実はここに通常のプロパティがあることもおわかりいただけると思います｡
‫このクラスのプロパティは､ is default is cancelled と is defaulted
‫と呼ばれ､ これらの依存関係のプロパティに接続されています｡
‫つまり､ スタイリングデータ､ バインドアニメーション､ 継承などの方法で設定できるプロパティを表しています｡
‫データバインディングについては､ 後ほど説明します｡
‫スタイリング､ 良いですね｡
‫今やったことは､ ボタンをスタイル付けすることで､ そのためにアニメーションと継承を使うことができます｡
‫しかし､ ここで､ ボタンがボタンベースを継承していることを知るために､ ボタンベースについてより深く見てみましょう｡
‫そして､ ボタン基盤の定義に行き､ 確認することができます｡
‫わかりました｡
‫コンテンツ・コントロール・クラスです｡
‫つまり､ ボタンベースはコンテンツコントロールを継承しているわけです｡
‫さて､ ボタンベースには､ ここにあるように､ クリックイベントが根付いています｡
‫そして､ 前回見たように､ includedイベントは､ 押されたクリックモード､
‫プロパティコマンド､ ターゲットなど､ たくさんの依存プロパティも持っているのですが｡
‫でも､ まだ手をつけていないものもあります｡
‫しかし､ さらに興味深いのは､ コンテンツ・コントロールのさらに奥に進むと､ has contentというプロパティがあることです｡
‫つまり､ こちらはボタンの中身をすべて引き受けているわけです｡
‫例えば､ テキストはボタン内のテキストブロックです｡
‫つまり､ ボタンの中にコンテンツがあるとすれば､ その時です｡
‫このクラスで処理されるから､ このコンテンツコントロールクラスで｡
‫そして､ 実際には､ さらに深く､ 定義に行くことができます｡ ここでは､ 多くの依存性プロパティと2つのルートイベントを見つけることができます｡
‫そして､ このコントロールクラスは､ ボーダーブラシとパディングプロパティと呼ばれる依存性を持っています｡
‫つまり､ ボーダーの色と､ 垂直方向のコンテンツアライメント､ 水平方向のコンテンツアライメントを指定するのです｡
‫そして今ここで､ 私たちが使ったからこそ面白いのがこの1枚｡
‫これはbackgroundプロパティで､ まさにXAMLファイルに設定されているものです｡
‫このように､ 背景をPale Violet Redに設定することで､ このプロパティからこれらの依存プロパティにアクセスできるようになります｡
‫これらは､ フォントサイズ､ フォント､ ファミリー､ バックグラウンド､ フォアグラウンドなど､ コントロールを扱うときに使用するすべての種類のプロパティです｡
‫そして､ 例えばボタンもコントロールですし､ テキストブロックもコントロールです｡
‫これらのクラスはすべてこのコントロールクラスを継承しており､ これらの依存プロパティがトリガーとなって､
‫うまく変更されたことを通知します｡
‫依存性プロパティは常に静的であり､ 読み取り専用であることが重要なのです｡
‫だから､ これはとても重要なことなのです｡
‫また､ 常にプロパティ名で終わっていることもおわかりいただけると思います｡
‫ですから､ ここでは依存関係のプロパティを定義するときはいつも､ プロパティそのものと同じ名前であるbackgroundと言うのです｡
‫例えばここでは､ 彼らの背景がどこにあるのか､ また､ 最後にpropertyという言葉があります｡
‫このように､ 私たちは非常に長い間､ 深いところに潜り込んでいましたが､ これで依存関係のプロパティーと､ 私たちが常に扱っているものについて､
‫もう少しご理解いただけると思います｡
‫つまり､ プロパティを弄っているのですが､ 実は依存関係のあるプロパティを弄っているのです｡
‫なぜ､ これだけのものが必要なのか？
‫さて､ このトリガーで何が起こっているのかを理解するために､ WPFはここで依存性プロパティを使用しています｡
‫例えば､ this is mouse overとis mouse overは､ 依存性プロパティの助けを借りてWPFにチェーン通知を提供し､
‫それによって値をtrueに設定することができるわけです｡
‫それから､ まだ触れていないことなので､ チェックしてみてください｡
‫実はビルドエラーがあったので､ このボタンを消す必要があります｡
‫しかし､ まだ取り上げていないこと､ 触れていないことで､ かなり重要なことがあります｡
‫このトリガーがあり､ プロパティがマウスオーバーの値であることがわかりますね｡
‫本当です｡
‫そして､ このマウスオーバーで起動するのは本当ですか？
‫まあ､ フォントサイズなどのプロパティが30に設定されるわけですが｡
‫そして､ もう一度お見せします｡
‫ほら､ 見てください｡
‫しかし､ 今ボタンを離すと､ この依存性プロパティによって､ 元に戻っているのがわかります｡
‫つまり､ 何が起こっているのかを知らせ､ フォントサイズの値を元の値に戻して販売しているのです｡
‫つまり､ ご覧の通り､ マウスオーバーしている間だけ真となり､ それは依存関係プロパティによって可能となるのです｡
‫依存性プロパティについては､ 常に静的で読み取り専用であるべきだと述べましたが､ それは､
‫すべてのコントロールが共有され､ 利用可能であるべきだからです｡
‫つまり､ あるコントロールが一度しか使えないようでは困るわけです｡
‫また､ 他のクラスや他のビューなどでも利用できるようにしたいものです｡
‫また､ 初期化後は値を変更してはいけないため､ staticです｡
‫そして､ この依存性プロパティのトリガーとなる連鎖通知は､ データマイニング､ アニメーション､ ここで見てきたようなトリガー､
‫スタイリングなどに必要なものです｡
‫さて､ このまま独自の依存性プロパティを作成したい場合は､ 以下の方法で行います｡
‫そこで､ このクラスに新しいプロパティを作成することにします｡
‫実際に呼んでみる｡
‫一番上に配置しよう｡
‫パブリックintマイプロパティと呼ぶことにしている｡
‫そして､ 先ほど言ったように､ これはc LRのプロパティで､ この中ではgetとsetが必要になるのですが､ それだけでは足りません｡
‫それをちょっとだけ調整するんです｡
‫そのマイプロパティに依存プロパティを作ってみましょう｡
‫そこで､ 私のdependency propertyと呼ばれるpublic
‫static read only dependency propertyを作成するつもりです｡ dependency propertyとその1つはdependency property dot registerですぐに初期化されるはずです｡
‫そこで､ 新しい依存性プロパティを登録するのですが､ 複数のものを割り当てる必要があります｡
‫例えば､ 文字列の名前が必要なので､ それを呼び出すだけです｡
‫マイプロパティ､ 次にプロパティタイプが必要です｡
‫では､ この物件はどのようなタイプにすべきなのでしょうか｡
‫そして､ ここで見てきたように､ my propertyであるプロパティはint型である｡
‫ということで､ int型のtypeを使うことにします｡
‫次に､ property ownerと入力します｡
‫つまり､ このプロパティの型のオーナーは､ 私のメイン・ウィンドウ・クラスです｡
‫そこで､ type of を main window とし､ プロパティのメタデータも渡す必要があります｡
‫そこで､ ゼロとなる新しいプロパティのメタデータを作成することにします｡
‫だから､ ここにゼロを入力するだけで､ そこはあまり派手なことはしない､ それだけです｡
‫というわけで､ 依存性プロパティの作成方法です｡
‫そして今､ 私のプロパティ自体も､ もちろんこの依存性プロパティの影響を受けているはずです｡
‫そのためには､ getとsetを調整して､ getterが私の依存性プロパティの取得値を返すようにする必要があります｡
‫しかし今度は､ dependencyプロパティの値がdependencyプロパティの型であり､ int型であると設定しても､
‫その中にあるようにキャストする必要があるという問題が発生しました｡
‫そこで､ これを整数にキャストして､ 先に進み､ 実際にこのゲッターを閉じることができます｡
‫そしてここでは､ dependency プロパティに与えられた値を設定しました｡
‫つまり､ ここでやっていることは､ 独自の依存性プロパティを作成する方法なのです｡
‫これが重要な静的読み取り専用なんですね｡
‫依存性プロパティタイプとして作成する必要があります｡
‫名前をつけて､ それから登録をして､ 名前と種類と､ 所有者がどこか､ あるいは所有者が何であるかが必要なのです｡
‫つまり､ プロパティが作成されるクラスで､ プロパティのメタデータを渡す必要があるので､ プロパティのメタデータを追加することができます｡
‫見ての通り､ 4種類のオーバーロードがあり､ デフォルト値であるオブジェクトを渡すことができます｡
‫そして､ デフォルト値ゼロでOKということです｡
‫つまり､ ここで設定したプロパティのメタデータにより､ 私のプロパティはデフォルトでゼロになるわけです｡
‫了解です｡
‫だから､ ここにはたくさんのものがある｡
‫また､ 開発する内容によっては､ 自分で依存性プロパティを作成することはないかもしれません｡
‫もし､ 依存性プロパティを使用する必要がある場合は､ 独自のプロパティを作成する方法を確認してください｡
‫そうでなければ､ ここにあったプロパティを使うだけで､ エンドユーザーにとっては､ あるいはUIを構築するだけの開発者にとっては､
‫それほど関係がないことになるでしょう｡
‫ただ､ ここでは物事の成り立ちや大切なことをお伝えしたいのです｡
‫わかりました｡
‫それでは､ 次のビデオでお会いしましょう｡