2010-10-22 13 views
29

Tengo una clase . Describe ViewModels para ListBox elementos.two itemtemplates for one listbox

<ListBox ItemsSource="{Binding Fruits}"> 

Y tengo

class BananaViewModel : FruitViewModel 

y

class AppleViewModel : FruitViewModel 

Fruits contiene BananaViewModel s y s AppleViewModel que está obligado a ItemsSource.

¿Cómo puedo hacer diferentes plantillas para manzanas y plátanos? Deben estar en una lista pero tienen plantillas diferentes

Respuesta

51

Puede definir las plantillas de datos que se aplican a cualquier instancia de un tipo específico especificando el DataType sin un x:Key. Al usar este método, no asigna nada al ItemTemplate - las plantillas se aplican automáticamente.

<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

¡Buenas cosas, gracias! – xSeder

+2

¡Gracias por mencionar que debe omitir la x: Clave! –

3

En ListView en XAML puede declarar ItemTemplateSelector. El valor para esto vendrá de un recurso estático o similar.

La implementación de su selector de plantillas debe implementar DataTemplateSelector y básicamente contendrá la instrucción 'if' que elige la plantilla de datos correcta en función del tipo de elemento enlazado. Es probable que encuentre el DataTemplate de los recursos del contenedor pasado (probablemente usando la función FindResource).

Editar: Buen enlace tal vez? http://www.switchonthecode.com/tutorials/wpf-tutorial-how-to-use-a-datatemplateselectorEnlace muerto.

+0

por favor, agregue un código de muestra aquí –