使用 Pivot.ItemTemplate 避免复制

Using Pivot.ItemTemplate to avoid replication

以下 XAML 工作正常:

<Page ...

    <Page.Resources>
        <SolidColorBrush x:Key="brushHeaderBkgr" Color="Blue" />
        <SolidColorBrush x:Key="brushContentBorder" Color="Aquamarine" />
        <SolidColorBrush x:Key="brushContentBkgr" Color="Blue" />
        <SolidColorBrush x:Key="brushContentList" Color="Red" />

        <Style TargetType="Border" x:Key="ContentFrame">
            <Setter Property="BorderBrush" Value="{StaticResource brushContentBorder}" />
            <Setter Property="BorderThickness"  Value="6" />
            <Setter Property="Padding"  Value="6" />
            <Setter Property="Background"  Value="{StaticResource brushContentBkgr}" />
        </Style>

        <Style TargetType="ListView" x:Key="ContentList" >
            <Setter Property="Background"  Value="{StaticResource brushContentList}" />
        </Style>
    </Page.Resources>

    <Grid>
        <Pivot Title="Whatever" Margin="10">
            <PivotItem Header="Header1" >
                    <Border Style="{StaticResource ContentFrame}">
                       <ListView x:Name="Content" Style="{StaticResource ContentList}" />
                    </Border>
            </PivotItem>

            <PivotItem Header="Header2" >
                    <Border Style="{StaticResource ContentFrame}">
                       <ListView x:Name="Content" Style="{StaticResource ContentList}" />
                    </Border>
            <PivotItem Header="Header3" >
                    <Border Style="{StaticResource ContentFrame}">
                       <ListView x:Name="Content" Style="{StaticResource ContentList}" />
                    </Border>
        </Pivot>

    </Grid>
</Page>

由于所有项目页面都具有相同的结构,我想通过使用 Pivot.ItemTemplate 来避免复制。这是修改后的 XAML:

<Page ...

    <Page.Resources>
        <SolidColorBrush x:Key="brushHeaderBkgr" Color="Blue" />
        <SolidColorBrush x:Key="brushContentBorder" Color="Aquamarine" />
        <SolidColorBrush x:Key="brushContentBkgr" Color="Blue" />
        <SolidColorBrush x:Key="brushContentList" Color="Red" />

        <Style TargetType="Border" x:Key="ContentFrame">
            <Setter Property="BorderBrush" Value="{StaticResource brushContentBorder}" />
            <Setter Property="BorderThickness"  Value="6" />
            <Setter Property="Padding"  Value="6" />
            <Setter Property="Background"  Value="{StaticResource brushContentBkgr}" />
        </Style>

        <Style TargetType="ListView" x:Key="ContentList" >
            <Setter Property="Background"  Value="{StaticResource brushContentList}" />
        </Style>
    </Page.Resources>

    <Grid>
        <Pivot Title="Whatever" Margin="10">
        <Pivot.ItemTemplate>
            <DataTemplate>
                    <Border Style="{StaticResource ContentFrame}">
                       <ListView x:Name="Content" Style="{StaticResource ContentList}" />
                </Border>
            </DataTemplate>
        </Pivot.ItemTemplate>

       <PivotItem Header="Header1" />
       <PivotItem Header="Header2" />
       <PivotItem Header="Header3" />

    </Grid>
</Page>

但是这不起作用,项目没有出现。为什么?

您不能以这种方式设置 ItemTemplate 和添加 PivotItems。您需要通过 ItemSource 将数据源添加到数据透视表并在项目模板中使用绑定。
看看这段代码。

MainPage.xaml:

<Pivot x:Name="Pivot" Title="Whatever" Margin="10">
    <Pivot.ItemTemplate>
        <DataTemplate>
            <Border Style="{StaticResource ContentFrame}">
                <ListView ItemsSource="{Binding ListViewSource}" Style="{StaticResource ContentList}" />
            </Border>
        </DataTemplate>
    </Pivot.ItemTemplate>
    <Pivot.HeaderTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Header}"/>
        </DataTemplate>
    </Pivot.HeaderTemplate>
</Pivot>

MainPage.xaml.cs:

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    List<PivotModel> items = new List<PivotModel>();
    items.Add(new PivotModel() { Header = "Header1", ListViewSource = Enumerable.Range(10, 10).ToList() });
    items.Add(new PivotModel() { Header = "Header2", ListViewSource = Enumerable.Range(20, 10).ToList() });
    items.Add(new PivotModel() { Header = "Header3", ListViewSource = Enumerable.Range(30, 10).ToList() });
    items.Add(new PivotModel() { Header = "Header4", ListViewSource = Enumerable.Range(40, 10).ToList() });

    Pivot.ItemsSource = items;
}

PivotModel.cs:

public class PivotModel
{
    public string Header { get; set; }

    public List<int> ListViewSource { get; set; }
}