XAML入門 -プロパティ要素構文-

今回はXAML構文の1つ、プロパティ要素構文です。


前回では属性構文について書きました。

属性構文ではプロパティを属性を用いて設定する事が出来ましたが、単純な文字列値を用いて設定出来ない物もあります。

複雑なプロパティの設定を行う場合に使用するのが今回のプロパティ要素構文です。


いつもの通りまずはMSDNでの説明から見てみます。


プロパティ要素構文は、基本的な XML 構文からやや逸脱した構文です。XML では、属性の値は事実上の文字列であり、変更できるのは使用する文字列エンコードの形式だけです。XAML では、他のオブジェクト要素をプロパティの値として割り当てることができます。これを実現するのがプロパティ要素構文です。プロパティを要素タグ内の属性として指定する代わりに、elementTypeName.propertyName という形式の開始要素タグを使用して指定します。後は、プロパティの値を指定して、最後にプロパティ要素を閉じます。


少し回りくどい説明ですが、まずは簡単な例を元に見ていきす。


<Button>
    <Button.Content>
        Click Me!
    </Button.Content>
</Button>

上記例はButtonクラスのContextプロパティに文字列"Click Me!"を設定しています。

定義方としては以下の通りです。


   1 <クラス>
   2     <クラス.プロパティ>
   3         設定値 または 設定オブジェクト要素
   4     </クラス.プロパティ>
   5 </クラス>

プロパティ要素構文では少し特殊な要素定義を行います。

MSDNの説明の中でも書かれている通り、<ElementTypeName.PropertyName>開始タグと</ElementTypeName.PropertyName>終了タグで子要素に設定対象の内部テキスト(リテラルのClick Me!)又は、オブジェクト要素を使用し指定します。

上記例では2行目から4行目までの部分の事になります。

ちなみに上記のような開始タグと終了タグで定義する要素をプロパティ要素と呼びます。



上記例ではButtonクラスのContentプロパティをプロパティ要素で定義し、文字列"Click Me!"をリテラルにて設定しています。

プロパティ要素の内部テキストは属性構文の属性値のルールと同様な処理が行われます。



次はオブジェクト要素を使用した例です。


<Button>
    <Button.Background>
        <SolidColorBrush Color="Red" />
    </Button.Background>
</Button>

上記例ではButtonクラスのBackgroundプロパティをプロパティ要素で定義し、プロパティ値に「オブジェクト要素構文 + 属性構文」としてSolidBrushオブジェクトを、ColorプロパティにRedを指定しています。

これを全てプロパティ要素構文を使用した場合は下記のようになります。


<Button>
    <Button.Background>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                Red
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </Button.Background>
</Button>

全てプロパティ要素で定義してみると、とても冗長なXAMLになってしまいます。

少しここで、前回の「属性構文」と今回の「プロパティ要素 + 属性構文」と「全てプロパティ要素構文」を見てみてその差を比較してみます。


■属性構文■
<Button Background="Red" />
 
■プロパティ要素 + 属性構文■
<Button>
    <Button.Background>
        <SolidBrush Color="Red" />
    </Button.Background>
</Button>
 
■全てプロパティ要素構文■
<Button>
    <Button.Background>
        <SolidColorBrush>
            <SolidColorBrush.Color>
                Red
            </SolidColorBrush.Color>
        </SolidColorBrush>
    </Button.Background>
</Button>

どうでしょうか?

Buttonクラスの背景色を赤にするだけでも、使用する構文によってこれだけパターンがあります。

パターンが複数存在するのは今回のように、属性構文でもプロパティ要素構文でも定義する事が出来るプロパティであればの話しですが、少しは属性構文とプロパティ要素構文での違いがご理解頂けたでしょうか?



属性構文でもプロパティ要素構文でも指定する事が出来るプロパティであれば通常は属性構文を使用します。

MSDNでもこのように説明されています。




プロパティ要素内の値を内部テキストとして指定することもできます。ただし、その場合は、指定されているプロパティ型がプリミティブ型 (String など) か、名前が指定されている列挙型である必要があります。この 2 つの使用方法は属性構文でもサポートされているため、一般的ではありません。



説明の通り、属性構文で定義出来る場合は属性構文。属性構文で定義出来ない場合はプロパティ要素構文で定義する。

通常業務画面ではとても沢山のXAMLが定義されるため、構文の使い分けは大変重要になってくるでしょう。