2010-10-22 13 views
29

Ho una classe . Descrive ViewModels per gli articoli ListBox.due itemtemplates per una listbox

<ListBox ItemsSource="{Binding Fruits}"> 

E ho

class BananaViewModel : FruitViewModel 

e

class AppleViewModel : FruitViewModel 

Fruits contiene BananaViewModel s e AppleViewModel s che è destinato a ItemsSource.

Come posso creare modelli diversi per mele e banane? Dovrebbero essere in una lista ma hanno modelli diversi

risposta

51

È possibile definire DataTemplates che si applicano a qualsiasi istanza di un tipo specifico specificando DataType senza x:Key. Utilizzando questo metodo non si assegna nulla a ItemTemplate - i modelli vengono applicati automaticamente.

<ListBox ItemsSource="{Binding Path=MixedList}"> 
    <ListBox.Resources> 
     <DataTemplate DataType="{x:Type local:BananaViewModel}"> 
      <TextBlock Text="{Binding Name}" Foreground="Yellow"/> 
     </DataTemplate> 
     <DataTemplate DataType="{x:Type local:AppleViewModel}"> 
      <TextBlock Text="{Binding Name}" Foreground="Red"/> 
     </DataTemplate> 
    </ListBox.Resources> 
</ListBox> 
+0

Roba buona, grazie! – xSeder

+2

Grazie per aver detto che devi omettere x: Key! –

3

Nel ListView in XAML è possibile dichiarare un ItemTemplateSelector. Il valore per questo verrà da una risorsa statica o simile.

L'implementazione del selettore modello deve implementare DataTemplateSelector e in pratica contiene l'istruzione "se" che sceglie il DataTemplate corretto in base al tipo di elemento associato. Probabilmente troverà il DataTemplate dalle risorse del contenitore passato (probabilmente usando la funzione FindResource).

Modifica: buon collegamento forse? http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselectorCollegamento guasto.

+0

Si prega di aggiungere un codice di esempio qui –