LongListSelector другой шаблон элемента для первого и последнего элемента

Я пишу свое приложение для Windows Phone 8, которое использует LongListSelector для отображения некоторых данных.

Как установить другой шаблон элемента для первого и последнего элемента в LongListSelector?

По сути, я просто хочу отображать одну и ту же информацию в каждом элементе, но использую немного разные "макеты" элементов в последнем и первом элементах.

1 ответ

Решение

Вы могли бы реализовать некоторый селектор шаблонов данных, чтобы помочь определить, какой шаблон выбрать на основе индекса. Вы можете начать с создания многоразового резюме TemplateSelector учебный класс. Я использовал многие идеи, описанные в разделе " Реализация Windows Phone 7 DataTemplateSelector" и "CustomDataTemplateSelector", но изменил реализацию, чтобы вместо этого выбирать шаблоны на основе индекса.

public abstract class TemplateSelector : ContentControl {
  public abstract DataTemplate SelectTemplate(object item, int index, int totalCount, DependencyObject container);

  protected override void OnContentChanged(object oldContent, object newContent) {
    base.OnContentChanged(oldContent, newContent);

    var parent = GetParentByType<LongListSelector>(this);
    var index = parent.ItemsSource.IndexOf(newContent);
    var totalCount = parent.ItemsSource.Count;

    ContentTemplate = SelectTemplate(newContent, index, totalCount, this);
  }

  private static T GetParentByType<T>(DependencyObject element) where T : FrameworkElement {
    T result = null;
    DependencyObject parent = VisualTreeHelper.GetParent(element);

    while (parent != null) {
      result = parent as T;

      if (result != null) {
        return result;
      }

      parent = VisualTreeHelper.GetParent(parent);
    }

    return null;
  }
}

Когда у вас есть этот класс, вы можете добавить свою собственную логику селектора шаблона данных. В вашем случае может быть что-то вроде этого

public class MyTemplateSelector : TemplateSelector {
  public DataTemplate First { get; set; }
  public DataTemplate Default { get; set; }
  public DataTemplate Last { get; set; }

  public override DataTemplate SelectTemplate(object item, int index, int totalCount, DependencyObject container) {
    if (index == 0)
      return First;
    else if (index == totalCount-1)
      return Last;
    else
      return Default;
  }
}

И, наконец, Xaml

<phone:PhoneApplicationPage.Resources>
    <DataTemplate x:Key="first">
        <TextBlock Text="{Binding Name}" Foreground="Yellow" />
    </DataTemplate>
    <DataTemplate x:Key="default">
        <TextBlock Text="{Binding Name}" />
    </DataTemplate>
    <DataTemplate x:Key="last">
        <TextBlock Text="{Binding Name}" Foreground="Red" />
    </DataTemplate>

    <DataTemplate x:Key="SelectingTemplate">
        <local:MyTemplateSelector Content="{Binding}"
                                First="{StaticResource first}"
                                Default="{StaticResource default}"
                                Last="{StaticResource last}"
                                HorizontalContentAlignment="Stretch" />
    </DataTemplate>
</phone:PhoneApplicationPage.Resources>

<phone:LongListSelector
            ItemTemplate="{StaticResource SelectingTemplate}"
            ItemsSource="{Binding Data}" />
Другие вопросы по тегам