かずきのBlog@hatena

すきな言語は C# + XAML の組み合わせ。Azure Functions も好き。最近は Go 言語勉強中。日本マイクロソフトで働いていますが、ここに書いていることは個人的なメモなので会社の公式見解ではありません。

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