项模板代码隐藏

本文关键字:隐藏 代码 | 更新日期: 2023-09-27 17:57:14

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

例如给定具有项模板的项控件(如下所示),访问为控件中的每个项生成的数据模板中的实际文本块。(不是对象,而是其关联的文本块)。

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

Views/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; }
    }
}

模特/人.cs:

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

为什么我需要此访问权限?例如:尝试为每个文本块设置不同的行索引。无需将"LineIndex"属性添加到您的个人(因为这会违反 MVVM)。

项模板代码隐藏

我想通了。您将访问此类 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);
        }
    }
}