tmytのらくがき

個人の日記レベルです

XAMLの子要素を格納するプロパティ

こんなXAMLがあるとします。

<local:MyClass>
    <local:MyClass.Values>
        <local:Value />
        <local:Value />
    </local:MyClass.Values>
</local:MyClass>

なんだかValuesってやるのめんどくさくないですか。めんどくさいですよね。標準の要素ならこういう風に書けます。

<Grid>
    <Control />
    <Control />
</Grid>

これは省略された書き方で、省略しない場合は次の様に書きます。

<Grid>
    <Grid.Children>
        <Control />
        <Control />
    </Grid.Children>
</Grid>

このプロパティ名の省略、自作のクラスでも対応できます。

XAMLの子要素を格納するプロパティを指定するにはC#で次の様に書きます。

[ContentProperty(Name="Values")]
public class MyClass
{
    public IList<Value> Values { get; set; }
}

ここで重要なのがContentProperty Attribute。これが指定されていると XAMLパーサは子要素をこのプロパティに格納しようとします。

その結果、このクラスは子要素をValuesプロパティに格納しようとするので 冒頭のXAMLはこのようにかけます。

<local:MyClass>
    <local:Value />
    <local:Value />
</local:MyClass>

とっても便利なのでみなさんも是非。というかよく忘れるのでメモです。