项目模板代码隐藏

时间:2014-04-07 00:57:04

标签: c# xaml datatemplate

有没有办法访问为itemscontrol的项目生成的容器?

例如, 给定带有ItemTemplate的ItemsControl,如下所示,访问为控件中的每个项生成的DataTemplate中的实际TextBlock。 (不是对象,而是其关联的文本块)。

查看/ MainPage.xaml中:

<phone:PhoneApplicationPage
    x:Class="PhoneApp1.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
    xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:vm="clr-namespace:PhoneApp1.ViewModels"
    xmlns:toolkit="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone.Controls.    Toolkit"
    mc:Ignorable="d"
    FontFamily="{StaticResource PhoneFontFamilyNormal}"
    FontSize="{StaticResource PhoneFontSizeNormal}"
    Foreground="{StaticResource PhoneForegroundBrush}"
    SupportedOrientations="Portrait" Orientation="Portrait"
    shell:SystemTray.IsVisible="True">

    <!--LayoutRoot is the root grid where all page content is placed-->
    <phone:Pivot>
        <phone:Pivot.Resources>
            <vm:PersonViewModel x:Key="ViewModel"/>
        </phone:Pivot.Resources>

        <phone:PivotItem>
            <phone:PivotItem.Header>
                <TextBlock Text="Pivot"/>
            </phone:PivotItem.Header>

            <ItemsControl x:Name="People" DataContext="{StaticResource ViewModel}"     ItemsSource="{Binding People}">
                <ItemsControl.ItemTemplate>
                    <DataTemplate>
                        <TextBlock toolkit:SlideInEffect.LineIndex="{Binding PersonLineIndex}"     Text="{Binding Name}"/>
                    </DataTemplate>
                </ItemsControl.ItemTemplate>
            </ItemsControl>
        </phone:PivotItem>

        <phone:PivotItem>
            <phone:PivotItem.Header>
                <TextBlock Text="Empty Pivot"/>
            </phone:PivotItem.Header>
        </phone:PivotItem>
    </phone:Pivot>

</phone:PhoneApplicationPage>

查看/ MainPage.xaml.cs中

using Microsoft.Phone.Controls;

namespace PhoneApp1
{
    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
    }
}

的ViewModels / PersonViewModel.cs

using PhoneApp1.Models;
using System.Collections.Generic;
using System.Collections.ObjectModel;

namespace PhoneApp1.ViewModels
{
    public class PersonViewModel
    {
        public PersonViewModel()
        {
            People = new ObservableCollection<Person>
            {
                new Person { Name = "Joe" },
                new Person { Name = "Jack" },
                new Person { Name = "James" },
                new Person { Name = "John" }
            };

            PersonLineIndex = new List<int>();
            for (int i = 0; i < People.Count; i++)
            {
                PersonLineIndex.Add(i);
            }
        }

        public ObservableCollection<Person> People { get; set; }

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

型号/ Person.cs:

namespace PhoneApp1.Models
{
    public class Person
    {
        public string Name { get; set; }
    }
}

为什么我需要此访问权限?例如: 尝试为每个文本块设置不同的行索引。没有添加&#34; LineIndex&#34;您的人的财产(因为这将违反MVVM)。

1 个答案:

答案 0 :(得分:0)

我明白了。您将访问此类ItemsControl的ItemContainerGenerator

public partial class MainPage : PhoneApplicationPage
{
    // Constructor
    public MainPage()
    {
        InitializeComponent();

        People.Loaded += People_Loaded;
    }

    void People_Loaded(object sender, System.Windows.RoutedEventArgs e)
    {
        for (int i = 0; i < People.Items.Count; i++)
        {
            var container = People.ItemContainerGenerator.ContainerFromIndex(i);
            container.SetValue(SlideInEffect.LineIndexProperty, i);
        }
    }
}