これまで見てきた依存関係プロパティは全て読み書きできるものでしたが、読み取り専用の依存関係プロパティも定義できます。読み取り専用の依存関係プロパティは、DependencyPropertyKeyというクラスを使用します。
読み取り専用の依存関係プロパティの例を以下に示します。
// RegisterReadOnlyメソッドでDependencyPropertyKeyを取得privatestaticreadonly DependencyPropertyKey BirthdayPropertyKey = DependencyProperty.RegisterReadOnly( "Birthday", typeof(DateTime), typeof(Person), new PropertyMetadata(DateTime.Now)); // DependencyPropertyは、DependencyPropertyKeyから取得するpublicstaticreadonly DependencyProperty BirthdayProperty = BirthdayPropertyKey.DependencyProperty; public DateTime Birthday { // getは従来通りget { return (DateTime)GetValue(BirthdayProperty); } // setはDependencyPropertyKeyを使って行うprivateset { SetValue(BirthdayPropertyKey, value); } }
コメントにある通り、DependencyPropertyKeyクラスのインスタンスはDependencyPropertyクラスのRegisterReadOnlyメソッドを使って取得します。このDependencyPropertyKeyクラスのインスタンスは、外部に公開しないように管理します。
DependencyPropertyのインスタンスは、DependencyPropertyKeyクラスのDependencyPropertyプロパティを使って取得します。これは、普通の依存関係プロパティと同じようにpublic static readonlyのフィールドで管理します。あとは、GetValueメソッドとSetValueメソッドを使ったCLRのプロパティのラッパーを作るのですが、このときSetValueではDependencyPropertyKeyのインスタンスを使って設定を行います。DependencyPropertyクラスのインスタンスを使うと例外が発生するので注意してください。また、プロパティのsetterは、読み取り専用の依存関係プロパティでは外部に公開しないように管理します。
このように、値の取得には内部で管理しているDependencyPropertyKeyクラスのインスタンスを使うようにすることで読み取り専用の依存関係プロパティを実現します。DependencyPropertyKeyクラスのインスタンスを外部に公開すると、読み取り専用ではなくなってしまうため実装するさいは注意をして行ってください。
過去記事
- 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