3

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

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

В основном я просто хочу отображать одну и ту же информацию в каждом элементе, но использовать небольшой «макет» в последнем и первом элементах.

+0

какой-либо причине не использовать [ListHeader] (http://msdn.microsoft.com/en-us/ библиотека/windowsphone/develop/microsoft.phone.controls.longlistselector.listheader (v = vs.105) .aspx) и [ListFooter] (http://msdn.microsoft.com/en-us/library/windowsphone/develop/ microsoft.phone.controls.longlistselector.listfooter (v = vs.105) .aspx)? –

ответ

11

Вы можете реализовать какой-то селектор шаблонов данных, чтобы помочь определить, какой шаблон выбрать на основе индекса. Вы можете начать с создания многоразового абстрактного класса 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}" /> 
+0

По какой-то причине я не могу заставить это работать ... Проблема в SelectingTemplate. Если я устанавливаю LongListSelector на «вручную», используйте любой из шаблонов (сначала, по умолчанию или последний), он отлично работает. Я устанавливаю источник источника LongListSelector из кода позади, не может быть причина ?! Currenlty im получает исключение без очевидной причины, и если я устанавливаю точки торможения на MyTemplateSelector, они не попадают. – devha

+0

Элементы настройки Источник из кода позади также должен работать. Какое сообщение об исключении вы получаете? И на какой линии? –

+0

Исключение: получение im http://pastebin.com/mxULVRuk Исключение попадает в мое приложение App.xaml.cs - Application_UnhandledException (...). Я не могу получить номер строки, здесь это происходит ... – devha

Смежные вопросы