【问题标题】:Bind Pivot Header Template绑定数据透视表头模板
【发布时间】:2013-03-18 15:22:01
【问题描述】:

我在Blend 中添加了一个Pivot Control 和三个PivotItems。每个PivotItem 都有一个ViewModel,因为它是DataContext。每个ViewModel 都有一个字符串属性Title。我想编辑Header Template,创建一个TextBlock 并将它的Text 属性绑定到Title,但由于某种原因它不起作用。我确定这是因为Header TemplateDataContext 为null,但我认为它会从特定的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 的东西。我知道我可以将ViewModels 中的List 用于PivotControl.ItemSource,但是我必须使用DataTemplateSelector 等等,我不希望这样。

所以我想我的问题是,如何让 HeaderTemplate 继承 PivotItem 的 DataContext? 谢谢。

【问题讨论】:

  • 你试过使用元素绑定吗?
  • 我不确定你的意思。

标签: data-binding pivot windows-phone mvvm-light


【解决方案1】:

那是行不通的。您应该按以下方式编写 HeaderTemplate:

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

Textblock 将从 PivotItem 的 Header 属性接收绑定。对于每个 PivotItem,您绑定其 Header:

<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>

【讨论】:

  • 我知道你在说什么,但想象一下我在标题模板中有一个图像和一个文本框,那么我将无法同时绑定它们。无论如何,最后我使用了 Pivot Control 的 ItemsSource 属性,这是我的 Pivot Items ViewModels 的基本 ViewModel,公开了 HeaderTemplate 的所有公共属性,并创建了一个 DataTemplateSelector,以便在我的 PivotItems 的不同 ItemTemplates 之间进行选择。花了一些时间才理解,但代码看起来很干净漂亮。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2013-07-27
  • 2012-09-25
  • 1970-01-01
  • 2013-03-25
  • 1970-01-01
相关资源
最近更新 更多