3

내 Windows phone 작성 중입니다. 8 LongListSelector를 사용하여 일부 데이터를 표시하는 앱입니다.LongListSelector 첫 번째 항목과 다른 항목의 다른 항목 템플리트

LongListSelector의 첫 번째 항목과 마지막 항목에 다른 항목 템플릿을 설정하는 방법은 무엇입니까?

기본적으로 모든 항목에 동일한 정보를 표시하고 싶지만 마지막 항목과 첫 번째 항목에는 거의 다른 항목 "레이아웃"을 사용하고 싶지 않습니다.

+0

에게 [ListHeader] 사용하지 어떤 이유 (http://msdn.microsoft.com/en-us/을 마지막으로이

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

그리고 같은 수 library/windowsphone/develop/microsoft.phone.controls.longlistselector.listheader (v = 1010) .aspx) 및 [ListFooter] (http://msdn.microsoft.com/en-us/library/windowsphone/develop/) microsoft.phone.controls.longlistselector.listfooter (v = 1010) .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; 
    } 
} 

일단 클래스를 만들면 고유 한 데이터 템플릿 선택기 논리를 추가 할 수 있습니다. 귀하의 경우, 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 항목 소스를 설정, 그 이유가 될 수 있을까요?! 명백한 이유없이 예외가 발생하고 MyTemplateSelector에 브레이크 포인트를 설정하면 충돌이 발생하지 않습니다. – devha

+0

코드 숨김에서 ItemsSource도 설정해야합니다. 어떤 예외 메시지가 나타 납니까? 그리고 어느 라인에서? –

+0

예외는 무엇입니까? http://pastebin.com/mxULVRuk 내 응용 프로그램 App.xaml.cs - Application_UnhandledException (...)에서 예외가 발견되었습니다. 나는 어떤 줄 번호도 얻을 수 없다, 여기 일어나고있다 ... – devha

관련 문제