2014-05-02 15 views
5

Sono sicuro che questo è semplice ma non riesco a capire come farlo. Fondamentalmente ho un elenco di clienti che proviene da un database di servizi mobili blu. finora tutto funziona bene, ma mi piacerebbe impostare il modello dell'articolo per ogni articolo in una listbox in base ai dati. Ho 2 modelli, uno per le aziende e solo per una persona. La mia domanda è come applicarli.Applicare più datatemplates alla listbox Itemtemplate in base ai dati

Modelli

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

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

Codice

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

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

risposta

5

È possibile utilizzare un DataTemplateSelector per selezionare dinamicamente il DataTemplate sulla base dei dati legati alle proprietà: codice

Esempio:

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> 
Problemi correlati