for WPF developers
Home Profile Tips 全記事一覧

添付プロパティの作成

(2017/05/17 14:04:55 created.)

(2017/05/24 17:03:12 modified.)

添付ビヘイビアを作成するためには、独自の添付プロパティを作成する必要があります。ここでは、SampleBehavior という名前のクラスを定義し、その中に添付プロパティを作成します。

作成した添付ビヘイビアは XAML 上で使用する View の要素となるので、作成するソースは Views フォルダの中にまとめておくとわかりやすくなります。


添付プロパティを定義するには、DependencyProperty.RegisterAttached() メソッドを使用します。例えば bool 型で IsEnabled という名前の添付プロパティは次のように記述することで定義できます。

SampleBehavior.cs
  1. namespace Tips_Behavior.Views.Behaviors
  2. {
  3.     using System.Windows;
  4.  
  5.     /// <summary>
  6.     /// サンプルのビヘイビアを表します。
  7.     /// </summary>
  8.     public class SampleBehavior
  9.     {
  10.         /// <summary>
  11.         /// IsEnabled 添付プロパティの定義
  12.         /// </summary>
  13.         public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(SampleBehavior), new PropertyMetadata(false, OnIsEnabledPropertyChanged));
  14.  
  15.         /// <summary>
  16.         /// IsEnabled 添付プロパティを取得します。
  17.         /// </summary>
  18.         /// <param name="target">対象とする DependencyObject を指定します。</param>
  19.         /// <returns>取得した値を返します。</returns>
  20.         public static bool GetIsEnabled(DependencyObject target)
  21.         {
  22.             return (bool)target.GetValue(IsEnabledProperty);
  23.         }
  24.  
  25.         /// <summary>
  26.         /// IsEnabled 添付プロパティを設定します。
  27.         /// </summary>
  28.         /// <param name="target">対象とする DependencyObject を指定します。</param>
  29.         /// <param name="value">設定する値を指定します。</param>
  30.         public static void SetIsEnabled(DependencyObject target, bool value)
  31.         {
  32.             target.SetValue(IsEnabledProperty, value);
  33.         }
  34.  
  35.         /// <summary>
  36.         /// IsEnabled 添付プロパティ変更イベントハンドラ
  37.         /// </summary>
  38.         /// <param name="sender">イベント発行元</param>
  39.         /// <param name="e">イベント引数</param>
  40.         private static void OnIsEnabledPropertyChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
  41.         {
  42.         }
  43.     }
  44. }

13 行目で IsEnabled 添付プロパティを定義しています。変数名は任意で構いませんが、可読性を考慮して、プロパティ名に "Property" を付加した IsEnabledProeprty などといった名前にすることが一般的です。 RegisterAttached() メソッドの第 1 引数にプロパティ名 "IsEnabled" を与えます。

第 2 引数にはプロパティの型を System.Type クラスで指定します。ここでは bool 型のプロパティを定義したいので、typeof(bool) を指定しています。

第 3 引数には、このプロパティがどのクラスに属するのかを System.Type クラスで指定します。ここでは SampleBehavior クラスを指定したので、追加した IsEnabled 添付プロパティは、SampleBehavior.IsEnabled として認識されるようになります。

第 4 引数以降は特に指定しなくてもプロパティ定義としては成立しますが、このプロパティの既定値や、値が変化したときのコールバックなどが指定でき、ビヘイビアを使用するためにはこの部分が重要になるので、ここでは FrameworkPropertyMetadata クラスを第 4 引数として指定しています。

FrameworkPropertyMetadata クラスのコンストラクタに対する第 1 引数に IsEnabled プロパティの既定値、第 2 引数にプロパティ値変更時のコールバックメソッドを指定しています。

添付プロパティを取得したり設定したりするためには、規定された名前のメソッドを用意する必要があります。取得するためのメソッドはプロパティ名の頭に "Get" を付けた名前で、ここでは GetIsEnabled という名前になります。設定するためのメソッドはプロパティ名の頭に "Set" を付けた名前で、ここでは SetIsEnabled という名前になります。それぞれのメソッドを 15~33 行目のように定義します。

以上で添付プロパティの定義は完了です。試しに XAML 上で添付プロパティを設定してみましょう。

MainView.xaml
  1. <Window x:Class="Tips_Behavior.Views.MainView"
  2.         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  3.         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  4.         xmlns:b="clr-namespace:Tips_Behavior.Views.Behaviors"
  5.         Title="MainView" Height="120" Width="300">
  6.     <StackPanel>
  7.         <Button Content="Click me." b:SampleBehavior.IsEnabled="False" />
  8.         <Button Content="Click me." b:SampleBehavior.IsEnabled="True" />
  9.         <TextBlock Text="Click me." b:SampleBehavior.IsEnabled="True" />
  10.     </StackPanel>
  11. </Window>

作成した IsEnabled 添付プロパティは SampleBehavior クラスに属しているので、このクラスが属する名前空間を 4 行目のように定義する必要があります。このエイリアスを用いて、7~9 行目のように IsEnabled 添付プロパティを任意のコントロールに添付することができます。

ここまでのサンプルコードでは、IsEnabled 添付プロパティを作成しただけなので、このプロパティが設定されたコントロールには特に変化はありません。