2014-05-02 8 views
5

Ich bin mir sicher, dass das einfach ist, aber ich kann einfach nicht herausfinden, wie es geht. Grundsätzlich habe ich eine Liste von Kunden, die aus einer azure Mobile Service Datenbank kommt. Bis jetzt funktioniert alles gut, aber ich möchte die Elementvorlage für jedes Element in einer Listbox basierend auf den Daten festlegen. Ich habe 2 Vorlagen, eine für Firmen und nur für eine Person. Meine Frage ist, wie man jeden anwendet.Wenden Sie mehrere Datatemplates auf Listbox ItemTemplate basierend auf Daten an

Vorlagen

<DataTemplate x:Key="CompanyItemTemplate"> 
    ------- 
</DataTemplate> 

<DataTemplate x:Key="CustomerItemTemplate"> 
    ------- 
</DataTemplate> 

-Code

CustomerListItems.ItemsSource = customeritems.OrderBy(customer => customer.CustomerName); 

foreach (Customers customer in customeritems) 
{ 
    if (customer.Company != "") 
    { 
     CustomerListItems.ItemTemplate = CompanyItemTemplate; 
    } 
    else 
    { 
     CustomerListItems.ItemTemplate = CustomerItemTemplate; 
    } 
} 

Antwort

5

können Sie ein DataTemplateSelector dynamisch verwenden, um den DataTemplate zu wählen, basierend auf den an Ihre Eigenschaften gebunden Daten:

Beispielcode:

public class ImgStringTemplateSelector : DataTemplateSelector 
{ 
    public DataTemplate ImageTemplate { get; set; } 
    public DataTemplate StringTemplate { get; set; } 

    public override DataTemplate SelectTemplate(object item, 
    DependencyObject container) 
    { 
    String path = (string)item; 
    String ext = System.IO.Path.GetExtension(path); 
    if (System.IO.File.Exists(path) && ext == ".jpg") 
     return ImageTemplate; 
    return StringTemplate; 
    } 
} 

    <Window.Resources> 
    <local:RelativeToAbsolutePathConverter x:Key="relToAbsPathConverter" /> 

    <DataTemplate x:Key="stringTemplate"> 
     <TextBlock Text="{Binding}"/> 
    </DataTemplate> 

    <DataTemplate x:Key="imageTemplate"> 
     <Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}" 
      Stretch="UniformToFill" Width="200"/> 
    </DataTemplate> 

    <local:ImgStringTemplateSelector 
     ImageTemplate="{StaticResource imageTemplate}" 
     StringTemplate="{StaticResource stringTemplate}" 
     x:Key="imgStringTemplateSelector" /> 
    </Window.Resources> 

    <Grid> 
    <ListView ScrollViewer.CanContentScroll="False" 
       ItemsSource="{Binding ElementName=This, Path=PathCollection}" 
       ItemTemplateSelector="{StaticResource imgStringTemplateSelector}"> 
    </ListView> 
    </Grid> 
</Window>