3

我正在构建一个 Silverlight 控件,并尝试通过它们各自的 DataTemplates 为 Header 和 Body ContentControls 设置绑定。我不知道为什么,但这不起作用(静默失败)。我唯一的猜测是这是因为 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>
4

3 回答 3

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}" 添加。这很重要。:)

于 2009-07-07T18:28:15.650 回答
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>

另见这篇文章

于 2009-07-07T12:17:07.307 回答
1

这适用于我的(3 Beta):

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

但是,我不知道它为什么会起作用...我认为这是因为您可以将模板放在演示者周围,但随后玩得更多,并意识到您包装 contentpresenter 的任何内容都会被完全忽略。

于 2009-07-07T13:18:47.893 回答