将DataTemplate绑定到CustomControl问题

时间:2011-06-24 14:45:32

标签: wpf silverlight data-binding custom-controls datatemplate

我得到的是一个自定义控件,它在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}'表达式。你有什么想法可能有什么不对吗?

2 个答案:

答案 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