2010-10-22 16 views
29

J'ai une classe . Il décrit ViewModels pour les articles ListBox.deux modèles d'article pour une boîte de liste

<ListBox ItemsSource="{Binding Fruits}"> 

Et j'ai

class BananaViewModel : FruitViewModel 

et

class AppleViewModel : FruitViewModel 

Fruits contient BananaViewModel s et AppleViewModel s qui est lié à ItemsSource.

Comment puis-je créer différents modèles pour les pommes et les bananes? Ils doivent être dans une liste mais avoir des modèles différents

Répondre

51

Vous pouvez définir des DataTemplates qui s'appliquent à n'importe quelle instance d'un type spécifique en spécifiant DataType sans x:Key. En utilisant cette méthode, vous n'attribuez rien à ItemTemplate - les modèles sont appliqués automatiquement.

<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

Bonnes choses, merci! – xSeder

+2

Merci de mentionner que vous devez omettre le x: Key! –

3

Sur le ListView en XAML vous pouvez déclarer un ItemTemplateSelector. La valeur pour cela proviendra d'une ressource statique ou similaire. L'implémentation de votre sélecteur de modèle doit implémenter DataTemplateSelector et contiendra essentiellement l'instruction 'if' qui choisit le DataTemplate correct en fonction du type de l'élément lié. Il trouvera probablement le DataTemplate dans les ressources du conteneur (probablement en utilisant la fonction FindResource).

Modifier: Bon lien peut-être? http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselectorLien mort.

+0

Veuillez ajouter un code d'échantillon ici –