将DataTemplate绑定到CustomControl问题

jus*_*ick 3 data-binding silverlight wpf custom-controls datatemplate

我得到的是一个自定义控件,它在 xaml 中实现数据模板:

<DataTemplate x:Key="Templat">
    <StackPanel>
        <TextBlock Text="Sample Text" />
        <TextBlock Text="{Binding Surname}" />
    </StackPanel>
</DataTemplate>
Run Code Online (Sandbox Code Playgroud)

和自定义控制:

 <local:MyControl x:Name="MyControl1" 
      ItemTemplate="{StaticResource Templat}" Margin="0,0,-24,8"/>
Run Code Online (Sandbox Code Playgroud)

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> 
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

我创建了一个自定义项目控件,其中有一些自定义内容控件。我希望它们都具有相同的内容模板,因此我将它们的内容模板绑定到父控件中定义的 itemtemplate。

我的问题是控件将显示带有“示例文本”文本的文本块,但不显示带有绑定值的文本块。我试图在代码隐藏中指定 DataContext(例如DataContext = new Person() { Surname="Johnson" }或通过 xaml)。它们都不起作用。

DataContext(Person 类)看起来传递正确,但传递的 DataTemplate 缺少表达式'{Binding Surname}'。您有任何想法可能会出现什么问题吗?

Cod*_*ked 5

DataTemplate 中控件的 DataContext 不是从其父级继承的。因此,在您的情况下, 中的所有内容都Templat将具有与 CustomItem 和 MyControl 不同的 DataContext。

DataTemplate 的 DataContext 来自关联的 ContentControl 或 ContentPresenter 的 Content 属性。因此,就您而言,如果您这样做:

<local:CustomItem x:Name="Item1" Content="{Binding}" ContentTemplate="{TemplateBinding ItemTemplate}" />
Run Code Online (Sandbox Code Playgroud)

然后您可以设置 MyControl 的 DataContext,它将传递到您的 DataTemplate。

从表面上看,您的 MyControl 应该是一个 ItemsControl (如此处所述