2016-08-03 9 views
1

Ich habe eine ListView, deren ItemsSource ich programmatisch in den Code hinter gesetzt habe. Früher hatte ich nur eine Vorlage, aber jetzt möchte ich mehrere Vorlagen verwenden und die Vorlage entsprechend dem Element auswählen, das ich zur ListView hinzufüge.ItemTemplateSelector funktioniert nicht für ListView ohne Bindung

Dies ist der XAML-Code ich habe:

<Page.Resources> 
<local:TemplateSelector x:Key="myTemplateSelector" TemplateA="{StaticResource TemplateA}" TemplateB="{StaticResource TemplateB}" /> 

<!-- TemplateA and TemplateB --> 
</Page.Resources> 

<ListView 
     x:Name="MasterListView" 
     Grid.Row="1" 
     ItemContainerTransitions="{x:Null}" 
     ItemTemplateSelector="{StaticResource myTemplateSelector}" 
     IsItemClickEnabled="True" 
     ItemClick="MasterListView_ItemClick"/> 

ich dann die ItemSource des Listview gesetzt und das ist mein TemplateSelector:

public class TemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate TemplateA { get; set; } 
    public DataTemplate TemplateB { get; set; } 

    public new DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 

     return TemplateA; 
    } 
} 

Dies ist jedoch nicht funktioniert. Anstelle meiner gewünschten Vorlage bekomme ich immer den gleichen Text für jedes Objekt: AppName.ViewModels.ViewModel1 (der Typ der Daten, die ich zeigen möchte).

In der Vergangenheit, als ich hatte nur ein itemtemplate ich dies in der XAML verwendet und es funktioniert:

 <ListView 
     x:Name="MasterListView" 
     Grid.Row="1" 
     ItemContainerTransitions="{x:Null}" 
     ItemTemplate="{StaticResource TemplateA}" 
     IsItemClickEnabled="True" 
     ItemClick="MasterListView_ItemClick"/> 

Wie kann ich das ItemTemplateSelector zu arbeiten? Ich habe dort Haltepunkte platziert, aber es wird nicht einmal aufgerufen.

Antwort

2

Wie es in der beschrieben wird, Anmerkungen von DataTemplateSelector.SelectTemplate(Object, DependencyObject) method:

App code typically doesn't call SelectTemplate methods; the methods exists so that the infrastructure can call it while choosing the correct templates based on using a DataTemplateSelector instance from a property value such as ItemsControl.ItemsTemplateSelector. To provide a specific template in a derived class, override the SelectTemplateCore(Object, DependencyObject) method.

Also sollten wir

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 

statt

public new DataTemplate SelectTemplate(object item, DependencyObject container) 
1
public override DataTemplate SelectTemplate(object item, DependencyObject container) 

statt

public new DataTemplate SelectTemplate(object item, DependencyObject container) 

EDIT, Modifikator aufgrund zuzugreifen, ist dies die Signatur für 4.5.2 (man beachte, es ist öffentlich):

#region Assembly PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\PresentationFramework.dll 
#endregion 

namespace System.Windows.Controls 
{ 
// 
// Summary: 
//  Provides a way to choose a System.Windows.DataTemplate based on the data object 
//  and the data-bound element. 
public class DataTemplateSelector 
{ 
    // 
    // Summary: 
    //  Initializes a new instance of the System.Windows.Controls.DataTemplateSelector 
    //  class. 
    public DataTemplateSelector(); 

    // 
    // Summary: 
    //  When overridden in a derived class, returns a System.Windows.DataTemplate based 
    //  on custom logic. 
    // 
    // Parameters: 
    // item: 
    //  The data object for which to select the template. 
    // 
    // container: 
    //  The data-bound object. 
    // 
    // Returns: 
    //  Returns a System.Windows.DataTemplate or null. The default value is null. 
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container); 
} 
} 
+0

verwenden Wenn ich das versuche ich die folgende Fehlermeldung erhalten: TemplateSelector.SelectTemplate (Objekt, DependencyObject) ‚: kann nicht Zugriffsmodifikatoren ändern, wenn überschreiben‘ geschützt 'geerbtes Mitglied' DataTemplateSelector.SelectTemplate (Objekt, DependencyObject) ' – slimshady

+0

Seltsam, ich denke, eine andere Framework-Version? Sie sollten jedoch anstelle von neu überschreiben. Ich habe meinen Beitrag mit der Quelle aktualisiert, da der Zugriffsmodifikator öffentlich ist. – user1515791

Verwandte Themen