2016-03-19 13 views
0

Ich versuche DataTemplateSelector zu erstellen, um eine andere Artikelvorlage für mein erstes und letztes Listenobjekt zu wählen.UWP ListView, verschiedene Artikelvorlage für den ersten und letzten Artikel

In meinem DataTemplateSelector versuche ich Eltern ListView zu finden und basierend auf diesem Check Item Index und richtige Datenvorlage zu wählen.

Das Problem ist, dass ich nicht im Parent ListView wie in der SelectTemplateCore() DependencyObject Container Objekt ist übergeordnet ist Null.

Wie sollte ich verschiedene Vorlage basierend auf Artikelposition wählen?

My Datatemplateselector:

public class FirstLastDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DefaultTemplate { get; set; } 
    public DataTemplate FirstItemTemplate { get; set; } 
    public DataTemplate LastItemTemplate { get; set; } 

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
    { 
     var lv = GetListView(container); 
     if (lv != null) 
     { 
      var i = lv.Items.IndexOf(item); 
      if (i == 0) 
      { 
       return FirstItemTemplate; 
      } 
      else if (i == lv.Items.Count - 1) 
      { 
       return LastItemTemplate; 
      } 
     } 
     return DefaultTemplate; 
    } 

    public static ListView GetListView(DependencyObject element) 
    { 
     if (element is ListView) 
     { 
      return (ListView)element; 
     } 
     var r = VisualTreeHelper.GetChildrenCount(element); 
     for (int i = 0; i < VisualTreeHelper.GetChildrenCount(element); i++) 
     { 
      var child = VisualTreeHelper.GetChild(element, i); 

      var result = GetListView(child); 
      if (result == null) 
      { 
       continue; 
      } 
      else 
      { 
       return result; 
      } 
     } 
     return null; 
    } 
} 

Listview in XAML:

<ListView ItemsSource="{x:Bind ViewModel.Items, Mode=OneWay}" ItemTemplateSelector="{StaticResource FirstLastDataTemplateSelector}" SelectionMode="None" IsItemClickEnabled="False"> 
+0

Könnten Sie den Typ der ersten und letzten Elemente zu ändern (ein Erbe oder Wrapper verwenden)? Sie hätten dann eine viel einfachere Aufgabe. – CKII

+0

Ich könnte den Typ der Listenelemente ändern, aber in diesem Fall möchte ich irgendwie nicht die tatsächlichen Objekte der Listenobjekte berühren (wenn möglich). Ich habe diese Art Template-Selektor-Lösung in WP8 (Silverlight) -App verwendet, aber jetzt bin ich nicht in der Lage, die Eltern-Listview zu bekommen. – devha

+0

Haben Sie versucht, die Liste mit Xamlspy zu überprüfen? Es sollte Ihnen zeigen, wie es aufgebaut ist, und Sie könnten den Code entsprechend anpassen. Vielleicht gibt es dort irgendwo ein anderes ItemsControl, das Sie überprüfen müssen, und nicht das ListView. Listenansichten können je nach Quelle unterschiedlich dargestellt werden. Insbesondere das Gruppieren verursacht dieses Verhalten. – CKII

Antwort

1

das Problem in meiner ursprünglichen Datatemplateselector gefunden. Ich habe versucht, Kind-Objekt zu finden, obwohl ich das Eltern-ListView tatsächlich brauche.

Hier wird aktualisiert, fest, Datatemplateselector:

public class FirstLastDataTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate DefaultTemplate { get; set; } 
    public DataTemplate FirstItemTemplate { get; set; } 
    public DataTemplate LastItemTemplate { get; set; } 

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
    { 
     var lv = GetListView(container); 
     if (lv != null) 
     { 
      var i = lv.Items.IndexOf(item); 
      if (i == 0) 
      { 
       return FirstItemTemplate; 
      } 
      else if (i == lv.Items.Count - 1) 
      { 
       return LastItemTemplate; 
      } 
     } 
     return DefaultTemplate; 
    } 


    public static ListView GetListView(DependencyObject element) 
    { 
     var parent = VisualTreeHelper.GetParent(element); 
     if (parent == null) 
     { 
      return null; 
     } 
     var parentListView = parent as ListView; 
     return parentListView ?? GetListView(parent); 
    } 
} 
Verwandte Themen