

WPFでコレクションバインドを行うコントロールを作成しています。

コントロールにバインドされているデータの関連を表現するため、`HierarchicalDataTemplate`のような`BindingBase`型のプロパティを持つ`DataTemplate`派生型を定義しました。しかしC#コードのビルドは可能ですがXAMLでプロパティを設定すると、

> プロパティ 'Fuga' は、テンプレートのプロパティ要素として設定できません。Triggers と Storyboards
> だけをプロパティ要素として使用できます。

と出力されてしまいます。Visual Studio 2013と.NET4.5.1で条件を変えて試したところ、

  1. 元の事象→NG

C#

[code]

    public class HogeDataTemplate : DataTemplate
    {
       public BindingBase Fuga { get; set; }
    }
    
[/code]

XAML

[code]

    <c:CustomControl1>
        <c:CustomControl1.HogeTemplate>
            <c:HogeDataTemplate Fuga="{Binding Piyo}" />
        </c:CustomControl1.HogeTemplate>
    </c:CustomControl1>
    
[/code]

  2. Resourcesに記述した場合→NG

XAML

[code]

    <Window>
        <c:Window.Resources>
            <c:HogeDataTemplate x:Key="hoge" Fuga="{Binding Piyo}" />
        </c:Window.Resources>
    </Window>
    
[/code]

  3. `{Binding}`以外のマークアップ拡張を使用した場合→NG

XAML

[code]

    <c:HogeDataTemplate Fuga="{x:Null}" />
    
[/code]

  4. プリミティブ型に変更した場合→OK

C#

[code]

    public class HogeDataTemplate : DataTemplate
    {
       public int Fuga { get; set; }
    }
    
[/code]

XAML

[code]

    <c:HogeDataTemplate Fuga="123" />
    
[/code]

  5. 要素記法を使用した場合→OK

XAML

[code]

    <c:HogeDataTemplate>
        <c:HogeDataTemplate.Fuga>123</c:HogeDataTemplate.Fuga>
    </c:HogeDataTemplate>
    
[/code]

  6. 要素記法で型を明示した場合→NG

XAML

[code]

    <c:HogeDataTemplate>
        <c:HogeDataTemplate.Fuga>
            <sys:Int32>123</sys:Int32>
        </c:HogeDataTemplate.Fuga>
    </c:HogeDataTemplate>
    
[/code]

と、文字列でプロパティを記述することのみ可能であるように思われました。[HierarchicalDataTemplateの実装](http://referencesource.microsoft.com/#PresentationFramework/Framework/System/Windows/HierarchicalDataTemplate.cs,4c41161ffea91bc9)では特にカスタム属性などを指定してはいないのでBAML変換ランタイムで`DataTemplate`専用の最適化がかかっている影響ではないかと思いますが、`Style`でバインドさせる以外の回避方法は無いでしょうか。


CC BY-SA 3.0
2015-07-04T00:38:59.087
12007
2015-07-04T00:38:59.087
5750
question
c# visual-studio wpf
DataTemplate継承クラスにプロパティを設定するとビルド時に例外が発生する