我正在尝试创建控件,该控件将ItemsSource
和InnerTemplate
并显示包含在CheckBox
es中的所有项目。
该控件有2个依赖属性:
public static readonly DependencyProperty ItemsSourceProperty = DependencyProperty.Register("ItemsSource", typeof(IEnumerable), typeof(CheckBoxWrapperList), null);
public static readonly DependencyProperty InnerTemplateProperty = DependencyProperty.Register("InnerTemplate", typeof(DataTemplate), typeof(CheckBoxWrapperList), null);
这是模板:
<ControlTemplate TargetType="local:CheckBoxWrapperList">
<Grid>
<Grid.Resources>
<DataTemplate x:Key="wrapper">
<CheckBox>
<ContentPresenter ContentTemplate="{TemplateBinding InnerTemplate}" Content="{Binding}" />
</CheckBox>
</DataTemplate>
</Grid.Resources>
<ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
</Grid>
</ControlTemplate>
然而,这种方法不起作用
使用ControlPresenter.ContentTemplate
在TemplateBinding
中绑定不起作用
但是,当我不使用模板绑定并将模板作为静态资源引用时,它会按预期工作。
提前致谢。
答案 0 :(得分:18)
Silverlight和WPF
您可以使用相对源绑定解决此问题:
而不是:
{TemplateBinding InnerTemplate}
你会使用:
{Binding RelativeSource={RelativeSource AncestorType=local:CheckBoxWrapperList}, Path=InnerTemplate}
它有点麻烦,但它有效。
<强>的WinRT 强>
WinRT没有AncestorType。我有某些东西可以运作,但它有点可怕。
您可以使用附加属性存储TemplateBinding值,然后使用ElementName ...
访问它<ControlTemplate TargetType="local:CheckBoxWrapperList">
<Grid x:Name="TemplateGrid" magic:Magic.MagicAttachedProperty="{TemplateBinding InnerTemplate}">
<Grid.Resources>
<DataTemplate x:Key="wrapper">
<CheckBox>
<ContentPresenter ContentTemplate="{Binding ElementName=TemplateGrid, Path=(magic:Magic.MagicAttachedProperty)}" Content="{Binding}" />
</CheckBox>
</DataTemplate>
</Grid.Resources>
<ItemsControl ItemTemplate="{StaticResource wrapper}" ItemsSource="{TemplateBinding ItemsSource}" />
</Grid>
</ControlTemplate>
我不知道WinRT是否有更好的方法。
答案 1 :(得分:11)
TemplateBinding只能在ControlTemplate中使用,您在DataTemplate中使用它。 (DataTemplate在ControlTemplate中的事实并不重要)