2013-03-18 84 views
2

我有一个Pivot Control和三个PivotItems加入Blend。每个PivotItemViewModel,因为它是DataContext。每个ViewModel都有一个字符串属性Title。我想编辑Header Template,创建一个TextBlock并将它的Text属性绑定到Title,但由于某些原因它不起作用。我确信这是因为Header TemplateDataContext为空,但我认为它会从特定的PivotItem继承。这是标题模板的xaml代码。绑定枢轴页眉模板

<DataTemplate x:Key="HeaderTemplate"> 
     <Grid Height="47" Width="354"> 
      <TextBlock Margin="8,0,64,8" TextWrapping="Wrap" Text="{Binding Title}" d:LayoutOverrides="Width" FontSize="24" Foreground="Red"/> 
     </Grid> 
    </DataTemplate> 



    <controls:Pivot TitleTemplate="{StaticResource TitleTemplate}" HeaderTemplate="{StaticResource HeaderTemplate}"> 
     <!--Pivot item one--> 
     <controls:PivotItem DataContext="{Binding Home, Mode=OneWay}"> 
      <Grid> 
       <ListBox x:Name="listBox" ItemsPanel="{StaticResource HomeItemsPanel}" ItemTemplate="{StaticResource HomeItemTemplate}" ItemsSource="{Binding Tiles}"> 
        <i:Interaction.Triggers> 
         <i:EventTrigger EventName="SelectionChanged"> 
          <GalaSoft_MvvmLight_Command:EventToCommand Command="{Binding OnSelectionChanged}" CommandParameter="{Binding SelectedIndex, ElementName=listBox}"/> 
         </i:EventTrigger> 
        </i:Interaction.Triggers> 
       </ListBox> 
      </Grid> 
     </controls:PivotItem> 
     <controls:PivotItem Margin="0,8,0,1"> 
      <Grid/> 
     </controls:PivotItem> 

     <!--Pivot item two--> 
     <controls:PivotItem DataContext="{Binding More, Mode=OneWay}"> 
      <Grid/> 
     </controls:PivotItem> 
    </controls:Pivot> 

我想创建一个更复杂的Header Template,但是,现在我正在测试,如果我可以绑定它的东西不仅仅是一个TextBlock更出发之前。我知道我可以使用ListViewModels作为PivotControl.ItemSource,但是之后我将不得不使用DataTemplateSelector等等,我不想那样做。

所以我想我的问题是,我怎么能使HeaderTemplate继承根据PivotItem的DataContext? 谢谢。

+1

您是否尝试过使用元素绑定? – 2013-03-18 18:34:28

+0

我不确定你的意思。 – Cosmin 2013-03-18 19:07:49

回答

2

这是行不通的。你应该写HeaderTemplate中通过以下方式:

<controls:Pivot.HeaderTemplate> 
    <DataTemplate> 
     <TextBlock Text="{Binding}" /> 
    </DataTemplate> 
</controls:Pivot.HeaderTemplate> 

文本块将收到来自PivotItem的Header属性的绑定。对于每个PivotItem,您绑定其头:

<controls:PivotItem Header="{Binding Title}"> 
    <Grid/> 
</controls:PivotItem> 

唯一的问题仍然是每个枢轴的项目绑定到其自身的数据上下文。您可以使用以下代码为每个项目手动执行此操作:

<controls:PivotItem DataContext="{Binding Item1}" Header="{Binding Title}"> 
    <Grid/> 
</controls:PivotItem> 
<controls:PivotItem DataContext="{Binding Item2}" Header="{Binding Title}"> 
    <Grid/> 
</controls:PivotItem> 
+2

我知道你在说什么,但想象一下,在标题模板中有一个图像和一个文本框,那么我就无法将它们都绑定在一起。无论如何,最后我使用了Pivot Control的ItemsSource属性,一个用于我的Pivot Items ViewModel的基本ViewModel,公开HeaderTemplate的所有公共属性,并创建了DataTemplateSelector,以便在我的PivotItems的不同ItemTemplates之间进行选择。花了一段时间才明白,但代码看起来很干净漂亮。 – Cosmin 2013-03-19 20:33:58