添付プロパティは、別のDependencyObjectを継承したクラスに対して、任意のプロパティを設定することが出来る機能です。例えば、GridクラスのRow添付プロパティやColumn添付プロパティがあります。これは、Grid内の別コントロールに対して、何行目、何列目に表示するのかを設定するのに使用します。注目すべきなのは、Row添付プロパティとColumn添付プロパティはButtonなどには定義されていませんが、Buttonなどの様々なコントロールに設定可能な点です。これが添付プロパティの特徴になります。
<Grid><Grid.RowDefinitions><RowDefinition Height="Auto" /><RowDefinition Height="Auto" /></Grid.RowDefinitions><!-- Grid.Row添付プロパティの設定例 --><Button Grid.Row="0"Content="Button1" /><Button Grid.Row="1"Content="Button2" /></Grid>
添付プロパティを定義する方法は、基本的に依存関係プロパティと同じような流れになります。コード例を以下に示します。
publicstaticclass Sample { // RegisterAttachedメソッドを使って添付プロパティを作成するpublicstaticreadonly DependencyProperty BirthdayProperty = DependencyProperty.RegisterAttached( "Birthday", typeof(DateTime), typeof(Sample), new PropertyMetadata(DateTime.MinValue)); }
依存関係プロパティがRegisterメソッドを使っていたのに対して添付プロパティは、RegisterAttachメソッドを使用します。メソッドの引数は基本的にRegisterメソッドと同じです。添付プロパティのもう1つの特徴として、定義するクラス自体にはDependencyObjectクラスの継承は必要ないという点があります。添付プロパティを設定するクラス側でDependencyObjectクラスを継承していれば問題ありません。
添付プロパティの値の取得や設定も、依存関係プロパティと同様にGetValueメソッドとSetValueメソッドを使って行います。
// 依存関係プロパティと同様にSetValue、GetValueで値の設定を取得が可能 var p = new Person(); p.SetValue(Sample.BirthdayProperty, DateTime.Now); Console.WriteLine(p.GetValue(Sample.BirthdayProperty));
GetValueメソッドとSetValueメソッドを使って値の取得や設定を行うのは、非現実的なため、通常は添付プロパティを定義したクラスにGetプロパティ名、Setプロパティ名という名前の静的メソッドを定義します。上記のBirthday添付プロパティの完全な定義を以下に示します。
publicstaticclass Sample { // RegisterAttachedメソッドを使って添付プロパティを作成するpublicstaticreadonly DependencyProperty BirthdayProperty = DependencyProperty.RegisterAttached( "Birthday", typeof(DateTime), typeof(Sample), new PropertyMetadata(DateTime.MinValue)); // プログラムからアクセスするための添付プロパティのラッパーpublicstatic DateTime GetBirthday(DependencyObject obj) { return (DateTime)obj.GetValue(BirthdayProperty); } publicstaticvoid SetBirthday(DependencyObject obj, DateTime value) { obj.SetValue(BirthdayProperty, value); } }
このメソッドを使うと、添付プロパティを使うコードは以下のようになります。
// 通常はラッパーを使ってアクセスする var p = new Person(); Sample.SetBirthday(p, DateTime.Now); Console.WriteLine(Sample.GetBirthday(p));
過去記事
- WPF4.5入門 その1 「はじめに」
- WPF4.5入門 その2 「WPFとは」
- WPF4.5入門 その3 「Hello world」
- WPF4.5入門 その4 「Mainメソッドはどこにいった?」
- WPF4.5入門 その5 「全てC#でHello world」
- WPF4.5入門 その6 「WPFを構成するものを考えてみる」
- WPF4.5入門 その7 「XAMLのオブジェクト要素と名前空間」
- WPF4.5入門 その8 「オブジェクト要素のプロパティ」
- WPF4.5入門 その9 「コレクション構文」
- WPF4.5入門 その10 「コンテンツ構文」
- WPF4.5入門 その11 「マークアップ拡張」
- WPF4.5入門 その12 「その他のXAMLの機能」
- WPF4.5入門 その13 「簡単なレイアウトを行うコントロール」
- WPF4.5入門 その14 「レイアウトコントロールのCanvasとStackPanel」
- WPF4.5入門 その15 「レイアウトコントロールのDockPanelとWrapPanel」
- WPF4.5入門 その16 「ViewBoxコントロール」
- WPF4.5入門 その17 「ScrollViewerコントロール」
- WPF4.5入門 その18 「Gridコントロール part 1」
- WPF4.5入門 その19 「Gridコントロール part 2」
- WPF4.5入門 その20 「レイアウトに影響を与えるプロパティ」
- WPF4.5入門 その21 「WPFのコンセプトと重要な機能つまみ食い」
- WPF4.5入門 その22 「Buttonコントロール」
- WPF4.5入門 その23 「DataGridコントロール その1」
- WPF4.5入門 その24 「DataGridコントロール その2」
- WPF4.5入門 その25 「TreeViewコントロール その1」
- WPF4.5入門 その26 「TreeViewコントロール その2」
- WPF4.5入門 その28 「Calendarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その29 「ContextMenuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その30「Menuコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その31 「ToolBarコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その32 「CheckBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その33 「ComboBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その34 「ListBoxコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その35 「RadioButtonコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その36 「Sliderコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その37 「TabControl」 - かずきのBlog@hatena
- WPF4.5入門 その38 「ファイルダイアログ」 - かずきのBlog@hatena
- WPF4.5入門 その39 「情報を表示するコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その40 「Popup、ToolTip、TextBox、Image、MediaElementコントロール」 - かずきのBlog@hatena
- WPF4.5入門 その41 「DispatcherObject」 - かずきのBlog@hatena
- WPF4.5入門 その42 「WPFのプロパティシステム」 - かずきのBlog@hatena
- WPF4.5入門 その43 「読み取り専用の依存関係プロパティ」 - かずきのBlog@hatena
- 拡張されたプロパティメタデータ - かずきのBlog@hatena