かずきのBlog@hatena

日本マイクロソフトに勤めています。XAML + C#の組み合わせをメインに、たまにASP.NETやJavaなどの.NET系以外のことも書いています。掲載内容は個人の見解であり、所属する企業を代表するものではありません。

WPF4.5入門 その10 「コンテンツ構文」

コンテンツ構文

XAMLでは、基本的にプロパティを明示して、値を設定しますがXAMLマークアップするクラスにSystem.Windows.Markup.ContentPropertyAttribute属性でコンテンツプロパティが指定されている場合に限りプロパティ名を省略して書くことが出来ます。例えばWPFのボタンなどではContentという名前のプロパティがコンテンツプロパティとして指定されているので以下のように、プロパティ名を省略してXAMLを記述できます。

<!-- 省略したもの -->
<Button>Hello world</Button>
 
<!-- 省略してない書き方 -->
<Button>
    <Button.Content>Hello world</Button.Content>
</Button>

例えば、コレクション構文の例で示したItemクラスのChildrenプロパティをコンテンツプロパティとして設定するには以下のようにItemクラスに属性を設定します。

namespace CollectionXaml
{
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.Windows.Markup;
 
    // Childrenプロパティをコンテンツプロパティとして指定
    [ContentProperty("Children")]
    public class Item
    {
        public Item()
        {
            this.Children = new ItemCollection();
        }
 
        public string Id { get; set; }
        public ItemCollection Children { get; set; }
    }
 
    public class ItemCollection : Collection<Item> { }
}

このようにすると、Childrenプロパティの指定を省略できるようになるので、XAMLが以下のように簡潔になります。

<Item xmlns="clr-namespace:CollectionXaml;assembly=CollectionXaml"
      Id="item1">
    <Item Id="item1-1" />
    <Item Id="item1-2" />
    <Item Id="item1-3" />
</Item>

XAMLを読み込んで表示するコードと、実行結果はコレクション構文で示した内容と同じため省略します。