从DataTemplate中绑定?

时间:2009-07-06 18:21:47

标签: silverlight data-binding datatemplate

我正在构建一个Silverlight控件,我正在尝试通过各自的DataTemplates为Header和Body ContentControl设置绑定。我不知道为什么,但这不起作用(默默地失败)。我唯一的猜测是因为DataTemplates是StaticResources。有人可以提供建议吗?该控件具有以下默认模板:

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel>
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                           <TextBlock Text="{Binding HeaderText}" FontSize="15"/>
                        </StackPanel>
                    </DataTemplate>

                    <DataTemplate x:Key="DefaultBodyTemplate">
                        <StackPanel>
                            <TextBlock Text="{Binding BodyText}" FontSize="12"/>
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" 
                   ContentTemplate="{StaticResource DefaultHeaderTemplate}" />
                <ContentControl x:Name="Body" 
                   ContentTemplate="{StaticResource DefaultBodyTemplate}" />
            </StackPanel>
        </ControlTemplate>
   </Setter.Value>

   

谢谢!


更新

实际上,以下代码也不起作用,因此我对StaticResources的假设可能是错误的。

<ContentControl x:Name="Header">
<ContentControl.ContentTemplate>
    <DataTemplate x:Key="DefaultHeaderTemplate">
        <StackPanel>
            <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
        </StackPanel>
    </DataTemplate>
</ContentControl.ContentTemplate>
</ContentControl>

3 个答案:

答案 0 :(得分:3)

我不想回答我自己的问题,但我得到了它的工作。这真的是由于其他地方的问题。以下代码适用于我:

<Style TargetType="local:LayoutItem">
<Setter Property="Template">
    <Setter.Value>
        <ControlTemplate TargetType="local:LayoutItem">
            <StackPanel x:Name="LayoutRoot">
                <StackPanel.Resources>

                    <DataTemplate x:Key="DefaultHeaderTemplate">
                        <StackPanel>
                            <TextBlock FontSize="50" Text="{Binding Path=HeaderText}" />
                        </StackPanel>
                    </DataTemplate>

                </StackPanel.Resources>

                <ContentControl x:Name="Header" Content="{Binding}" ContentTemplate="{StaticResource DefaultHeaderTemplate}" />

            </StackPanel>
        </ControlTemplate>
    </Setter.Value>
</Setter>

请注意Content =“{Binding}”添加。这很重要。 :)

答案 1 :(得分:1)

您需要在某处设置页面的数据上下文。可以在

背后的代码中完成
/// ctor
public MyClass()
{
   this.DataContext = ObjectThatIsDataContext;
}

或在XAML中:

<UserControl ...>
    <UserControl.Resources>
       <myNS:MyClass x:Name="TheContext" x:Key="TheContext" />    </UserControl.Resources>
    <Grid x:Name="LayoutRoot" Background="White" DataContext="{StaticResource TheContext}" >
        <TextBlock Text="{Binding Path=Field1}" />
    </Grid>
</UserControl>

另见this post

答案 2 :(得分:1)

这适用于我的(3 Beta):

        <ContentControl x:Name="Header">
            <ContentControl.ContentTemplate>
                <DataTemplate >
                    <StackPanel>
                        <TextBlock Text="{Binding HeaderText}" FontSize="15"  />
                    </StackPanel>
                </DataTemplate>
            </ContentControl.ContentTemplate>
            <ContentPresenter />
        </ContentControl>

然而,我不知道它为什么会起作用......我认为这是因为你可以把你的模板放在演示者周围,但后来玩了一些,并意识到你将内容包装器包装起来的任何东西都被完全忽略了。