我正在构建一个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>
答案 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>
答案 2 :(得分:1)
这适用于我的(3 Beta):
<ContentControl x:Name="Header">
<ContentControl.ContentTemplate>
<DataTemplate >
<StackPanel>
<TextBlock Text="{Binding HeaderText}" FontSize="15" />
</StackPanel>
</DataTemplate>
</ContentControl.ContentTemplate>
<ContentPresenter />
</ContentControl>
然而,我不知道它为什么会起作用......我认为这是因为你可以把你的模板放在演示者周围,但后来玩了一些,并意识到你将内容包装器包装起来的任何东西都被完全忽略了。