XAML入門 -属性構文-

今回はXAML構文の中の属性構文についてです。


前回はクラスや構造体を定義する際に使用するオブジェクト要素構文についてでしたが、オブジェクト要素構文にて定義したクラスや構造体のプロパティやイベントハンドラを設定する際に使用する構文です。

まずはMSDNの説明を見てみましょう。


属性構文は、要素の属性を宣言することによってプロパティの値の設定やイベントのイベント ハンドラの指定を行うことができる XAML マークアップ構文です。要素は常にオブジェクト要素構文によって宣言されます。


説明の通り、属性構文を使用してプロパティやイベントハンドラを定義する場合、オブジェクト要素構文によって定義した要素の属性を用いて設定を行います。

定義方法は又は、になります。


まずは簡単なプロパティの設定例として、UserControlクラスのBackgroundプロパティにRedを設定する例です。

<UserControl Background="Red" />

次はイベントハンドラの定義例として、UserControlクラスのLoadedイベントのイベントハンドラを設定する例です。

<UserControl Loaded="UserControl_Loaded" />

上記ように属性を用いてプロパティやイベントハンドラの設定を行う事が出来ます。

この属性構文ですが、簡単にプロパティやイベントハンドラを設定する事が出来ますが、いくつかのルールがあります。


  • 2つの引用符(")で囲まれた文字列である。
  • 文字列から直接変換可能である。
  • 設定対象のプロパティはパブリックスコープの読み書き可能なプロパティである。
  • パブリックスコープのデリゲートを持つ、パブリックスコープのイベントである。

「2つの引用符(")で囲まれた文字列である。」の通り、属性構文で設定する値は文字列でなければなりません。

上記UserControlクラスのBackgroundプロパティを設定した例では文字列"Red"にてBackgroundプロパティを指定しました。



ここで疑問です。

Backgroundプロパティの型はSystem.Windows.Media.Brushの筈ですが、何故、文字列"Red"で設定可能なのでしょうか?

それはクラスや構造体で宣言されているTypeConverterを使用し、指定された文字列値を元にそのクラスや構造体の型でインスタンスを変換し返却する仕組みがあるからです。

実際System.Windows.Media.Brushクラスを見てみると、クラス属性としてBrushConverterが指定されている事が解ります。



次の「文字列から直接変換可能である。」は、プリミティブ型間の直接変換又は、列挙型の名前チェックの事をを指しています。

プリミティブ型についての詳細はこちらを参照して下さい。

プリミティブ型間の直接変換の良くXAMLで見るケースは、String型からBoolean型やString型からDouble型等があります。



例としてString型からBoolean型の直接変換です。

<UserControl IsEnabled="True" />

次にString型からDouble型の直接変換です。

<UserControl Height="300" Width="300" />

どちらの例も属性構文を使用し、文字列(String型)をBoolean型、Double型へ直接変換しています。



次の列挙型の名前チェックですが、UserControlクラスのVisibilityプロパティの設定例を見てみましょう。

<UserControl Visibility="Visible" />

上記例で設定しているUserControlクラスのVisibilityプロパティはVisibility列挙対型のプロパティで、文字列"Visible"としてVisibility列挙対のメンバを名前で指定しています。



さて、XAMLの属性構文では、設定する文字列値に解析処理順序があります。


  1. 中かっこ({})又は、System.Windows.Markup.MarkupExtensionの派生クラス(マークアップ拡張)を見つけると、それを評価しマークアップ拡張より返されたオブジェクトを使用する。
  2. TypeConverterが宣言されている場合、文字列値を元にTypeConverterより返却されたオブジェクトを使用する。
  3. いづれにも該当しない場合、直接変換が行われる。

このような解析処理順序を経て、属性構文による文字列値の設定が行われます。

TypeConverterやマークアップ拡張については、また別にアップしたいと思います。



今回の取り上げた例では簡単なプロパティを使用した為属性構文でプロパティ値を設定する事が出来ましたが、中には属性構文では設定が出来ない物もあり、その場合にプロパティ要素構文という構文を使用する事になります。

属性構文は比較的XAMLの可読性を上げ簡素化する事ができ、次回アップ予定のプロパティ要素構文を用いる場合に比べ簡単に設定する事が出来ます。