【问题标题】:LongListSelector different item template for first and last itemLongListSelector 第一个和最后一个项目的不同项目模板
【发布时间】:2013-07-23 21:11:41
【问题描述】:

我正在编写我的 Windows phone 8 应用程序,它使用 LongListSelector 来显示一些数据。

如何为 LongListSelector 中的第一项和最后一项设置不同的项模板?

基本上我只想在每个项目中显示相同的信息,但在最后一个项目和第一个项目中使用很少不同的项目“布局”。

【问题讨论】:

标签: windows-phone-8 itemtemplate longlistselector itemtemplateselector


【解决方案1】:

您可以实现某种数据模板选择器,以帮助根据索引确定要选择的模板。您可以从创建一个可重用的抽象 TemplateSelector 类开始。我使用了Implementing Windows Phone 7 DataTemplateSelector and 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}" />

【讨论】:

  • 由于某种原因我无法正常工作...问题出在 SelectingTemplate 中。如果我将 LongListSelector 设置为“手动”使用任何模板(第一个、默认或最后一个),它工作正常。我从后面的代码中设置 LongListSelector 项目源,这可能是原因吗?!当前我在没有明显原因的情况下出现异常,如果我将刹车点设置为 MyTemplateSelector,它们不会被击中..
  • 从后面的代码设置 ItemsSource 也应该有效。您收到的异常消息是什么?在哪一行?
  • 我得到的异常pastebin.com/mxULVRuk 在我的应用程序 App.xaml.cs - Application_UnhandledException(...) 中捕获了异常。我无法获得任何行号,这正在发生......
  • 嗯...您是否尝试仅使用上述代码创建一个空项目?它对我很好。
  • 有趣,用空项目试过这个,效果很好。从我的实际项目中删除模板选择器类并再次制作它们。效果很好!非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-09
  • 2016-12-23
  • 2020-07-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多