け〜くんこと K.Ktouth のだらだらした日常と突発的に作るプログラムや読み物とかの雑多サイト
Visual Studio 2008 Professional Edition アップグレード(AA)
WPFを利用するにあたり、クラスのプロパティの実装方法として「フィールドプロパティ」「依存プロパティ」「添付プロパティ」の3つの方法が提示されています。
んが。
対象クラスが持っていない(状況に依存する)プロパティを追加できる添付プロパティは用途が理解できたんですが、クラスの外から見た場合、フィールドプロパティと依存プロパティの差が実装手段以外にあるように見えなかったんですね。いくつかの制限が増えるだけじゃないのか、と。
昨日ちょっとしたクラスを設計していて、その辺をようやく理解。
つまり依存・添付プロパティの最大のメリットは「データ連結の対象プロパティに指定できる」って事なんですね。納得。
軽くまとめると……
フィールドプロパティ
C#言語、ひいてはCLR環境における標準仕様のプロパティの実装方法。CLR標準なので言語やランタイムバージョンに依存しない。
シンプルなコードで実装が可能。
データ連結のソースとしては指定可能だが、対象にする事は出来ない。
依存プロパティ
WPFで提供されている新しい手法のプロパティの実装方法。
ライブラリの一部としての提供なので言語には依存しないが、CLR3.0以上(WPF/WF)が必要。
言語でのサポートは特にないので、コードが若干複雑で定型的な記述が必要になる。
データ連結の対象にする事が出来る。
依存プロパティを持つクラスは DependencyObject 型から派生していないといけない。依存プロパティ情報をstaticで持つ。
添付プロパティ
特定の状況に依存する情報をオブジェクトに「後から追加する」というプロパティの実装方法。
基本部分は依存プロパティに準ずる。依存プロパティよりは複雑な記述が増える。
データ連結の対象にする事が出来る。
主にヘルパーメソッドと依存プロパティ情報をstaticで持つ。
こんな感じかな?
WPFで利用するデータクラスは INotifyPropertyChanged インターフェイスを持つのが普通だけど、依存プロパティと組み合わせるときにはコードの記述の仕方が変わります。
以下、フィールドと依存でのプロパティの実装の仕方の違い。
class Foo : DependencyObject, INotifyPropertyChanged
{
public static readonly BarProperty = DependencyProperty.Register(
"Bar", typeof(int), typeof(Foo), new PropertyMetaData(OnBarPropertyChanged)
);private static void OnBarPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
{
if (!e.NewValue.Equals(e.OldValue))
{
Foo value = (Foo)sender;
value.OnPropertyChanged("Foo");
}
}public int Bar
{
get { return (int)GetValue(BarProperty); }
set { SetValue(BarProperty, value); }
}private int _Buzz;
public int Buzz
{
get { return _Buzz; }
set
{
if (_Buzz != value)
{
_Buzz = value;
OnPropertyChanged("Buzz");
}
}
}public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(name)); }
}
}
Barが依存プロパティ、Buzzがフィールドプロパティの例。
Buzzはsetメソッドの中で値の変更後にOnPropertyChangedを呼び出すコードを記述していますが、依存プロパティのそれらの処理はsetコードの中では行いません。
# そもそもBarプロパティの実装は、コード記述の簡便化のためのラッパーでしかない。
で、どうするかというと DependencyProperty 定義時にイベントハンドラを追加し、そのイベントハンドラをstatic メソッドとして定義します。
イベント引数には NewValue と OldValue もありますので、今回は同値でない場合のみにPropertyChangedイベントハンドラを呼び出すようにしました。
値の検証などはまた別のメソッドを実装し、定義時の引数を追加する必要があります。
これで、即値を与えても良し、Binding オブジェクトを生成してデータ連結をしても良しの万能プロパティが使用可能になります。
ただし、FrameworkElement クラスの持つ SetBinding メソッドはありませんので、データを連結するときには BindingOperation.SetBinding メソッドを利用します。この場合は DataContext をたぐる機能はないはずなので、Binding オブジェクトには必ずソースを指定する必要があります。(未確認)
OVA『バカとテストと召喚獣 〜祭〜』上巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,409
中古 ¥ 3,680
OVA『バカとテストと召喚獣 〜祭〜』下巻 [Blu-ray]
(メディアファクトリー)
新品 ¥ 4,438
中古 ¥ 2,980
生徒会役員共DJCD「アニメ生徒会役員共が全部わかるラジオ、略して全ラ!...
(キングレコード)
新品 ¥ 2,238
中古 ¥ 1,850
WORKING!! 9 初回限定特装版 (SEコミックスプレミアム)
(高津 カリノ)
新品 ¥ 2,896
中古 ¥ 2,835
「声優グランプリ」公認!声優界<雀王>決定戦! <J-1グランプリ> V...
(オムニバス)
新品 ¥ 3,159
中古 ¥ 3,099
デッドライジング 2【CEROレーティング「Z」】
(カプコン)
新品 ¥ 2,740
中古 ¥ 1,010
スプリンターセル コンヴィクション
(ユービーアイ ソフト)
新品 ¥ 2,979
中古 ¥ 1,397
Xbox 360 250GB
(マイクロソフト)
新品 ¥ 34,980
中古 ¥ 25,400
学園黙示録 HIGHSCHOOL OF THE DEAD 7 オリジナル...
(佐藤 大輔)
新品 ¥ 9,800
中古 ¥ 4,797
学園黙示録 HIGHSCHOOL OF THE DEAD SECRET ...
(佐藤 大輔)
中古 ¥ 2,500
ソードアート・オンライン〈5〉ファントム・バレット (電撃文庫)
(川原 礫)
中古 ¥ 690
RPG W(・∀・)RLD6 ―ろーぷれ・わーるど― (富士見ファンタ...
(吉村 夜)
新品 ¥ 651
中古 ¥ 1
魔法少女リリカルなのはViVid (3)限定版 (角川コミックス・エース...
(藤真 拓哉)
新品 ¥ 1,680
中古 ¥ 1,338
魔法戦記リリカルなのはForce (3)限定版 (角川コミックス・エース...
(緋賀 ゆかり)
新品 ¥ 1,680
中古 ¥ 418
ダンジョンズ&ドラゴンズ第4版スターター・セット
(ジェームズ ワイアット)
新品 ¥ 4,980
中古 ¥ 4,311
アリアンロッド・サガ・リプレイ(5) 激闘のピースメイカー (富士見ド...
(菊池 たけし/F.E.A.R.)
新品 ¥ 693
中古 ¥ 190
アリアンロッド・サガ・コンチェルト 1 (電撃コミックス)
(佐々木 あかね)
新品 ¥ 599
中古 ¥ 90
堀さんと宮村くん(7)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 1,000
中古 ¥ 747
浅尾さんと倉田くん(3)(ガンガンコミックスONLINE)
(HERO)
新品 ¥ 690
中古 ¥ 370
7と嘘吐きオンライン―HERO個人作品集―(ガンガンコミックスONLIN...
(HERO)
新品 ¥ 710
中古 ¥ 158
ONE PIECE 65 (ジャンプコミックス)
(尾田 栄一郎)
NARUTO―ナルト― 59 (ジャンプコミックス)
(岸本 斉史)
ワンピース 海賊無双(通常版)(初回特典:オリジナルカスタムテーマ9種DLコード、ソーシャルゲーム専用レアフィギュア用コード同梱)
(バンダイナムコゲームス)
ドラゴンズドグマ(数量限定特典『バイオハザード6』体験版用DLコード同梱)
(カプコン)