我得到的是一个自定义控件,它在xaml中实现了datatemplate:
<DataTemplate x:Key="Templat">
<StackPanel>
<TextBlock Text="Sample Text" />
<TextBlock Text="{Binding Surname}" />
</StackPanel>
</DataTemplate>
和自定义控件:
<local:MyControl x:Name="MyControl1"
ItemTemplate="{StaticResource Templat}" Margin="0,0,-24,8"/>
generic.xaml(在我的自定义控件库中)有:
<ControlTemplate TargetType="local:MyControl">
<Canvas Name="LayoutRoot" Height="{TemplateBinding Height}"
Width="{TemplateBinding Width}"
Background="{TemplateBinding Background}"
CacheMode="BitmapCache">
<Canvas Name="ItemsHost" Margin="10,185,0,0" Height="615"
Width="{TemplateBinding Width}" CacheMode="BitmapCache">
<local:CustomItem x:Name="Item1"
ContentTemplate="{TemplateBinding ItemTemplate}" />
<local:CustomItem x:Name="Item2"
ContentTemplate="{TemplateBinding ItemTemplate}" />
</Canvas>
</Canvas>
</ControlTemplate>
我做错了什么?
我创建了一个自定义项控件,里面有一些自定义内容控件。我希望他们都拥有相同的内容模板,因此我将他们的内容模板绑定到父控件中定义的itemtemplate。
我的问题是控件会显示带有“示例文本”文本的文本块,但不会显示带有绑定值的文本块。我试图在代码隐藏中指定DataContext(如DataContext = new Person() { Surname="Johnson" }
或通过xaml。它们都不起作用。
DataContext(Person类)看起来传递正确,但传递的DataTemplate错过了'{Binding Surname}'
表达式。你有什么想法可能有什么不对吗?
答案 0 :(得分:4)
DataTemplate中控件的DataContext不是从它的父级继承的。因此,在您的情况下,Templat
中的所有内容都将具有与CustomItem和MyControl不同的DataContext。
DataTemplate的DataContext来自关联的ContentControl或ContentPresenter的Content属性。所以在你的情况下,如果你这样做:
<local:CustomItem x:Name="Item1" Content="{Binding}" ContentTemplate="{TemplateBinding ItemTemplate}" />
然后你可以设置MyControl的DataContext,它会传递给你的DataTemplate。
从它的外观来看,你的MyControl应该是一个ItemsControl(如here所述)。
答案 1 :(得分:1)
当我编写使用数据模板的自定义控件时,我必须在自定义控件中编写代码以将模板绑定到模型。如果第一个答案对您不起作用,请检查以下资源:
http://chris.59north.com/post/Using-DataTemplates-in-custom-controls.aspx