DataTemplate継承クラスにプロパティを設定するとビルド時に例外が発生する
WPFでコレクションバインドを行うコントロールを作成しています。
コントロールにバインドされているデータの関連を表現するため、HierarchicalDataTemplate
のようなBindingBase
型のプロパティを持つDataTemplate
派生型を定義しました。しかしC#コードのビルドは可能ですがXAMLでプロパティを設定すると、
プロパティ 'Fuga' は、テンプレートのプロパティ要素として設定できません。Triggers と Storyboards だけをプロパティ要素として使用できます。
と出力されてしまいます。Visual Studio 2013と.NET4.5.1で条件を変えて試したところ、
- 元の事象→NG
C#
public class HogeDataTemplate : DataTemplate
{
public BindingBase Fuga { get; set; }
}
XAML
<c:CustomControl1>
<c:CustomControl1.HogeTemplate>
<c:HogeDataTemplate Fuga="{Binding Piyo}" />
</c:CustomControl1.HogeTemplate>
</c:CustomControl1>
- Resourcesに記述した場合→NG
XAML
<Window>
<c:Window.Resources>
<c:HogeDataTemplate x:Key="hoge" Fuga="{Binding Piyo}" />
</c:Window.Resources>
</Window>
{Binding}
以外のマークアップ拡張を使用した場合→NG
XAML
<c:HogeDataTemplate Fuga="{x:Null}" />
- プリミティブ型に変更した場合→OK
C#
public class HogeDataTemplate : DataTemplate
{
public int Fuga { get; set; }
}
XAML
<c:HogeDataTemplate Fuga="123" />
- 要素記法を使用した場合→OK
XAML
<c:HogeDataTemplate>
<c:HogeDataTemplate.Fuga>123</c:HogeDataTemplate.Fuga>
</c:HogeDataTemplate>
- 要素記法で型を明示した場合→NG
XAML
<c:HogeDataTemplate>
<c:HogeDataTemplate.Fuga>
<sys:Int32>123</sys:Int32>
</c:HogeDataTemplate.Fuga>
</c:HogeDataTemplate>
と、文字列でプロパティを記述することのみ可能であるように思われました。HierarchicalDataTemplateの実装では特にカスタム属性などを指定してはいないのでBAML変換ランタイムでDataTemplate
専用の最適化がかかっている影響ではないかと思いますが、Style
でバインドさせる以外の回避方法は無いでしょうか。