2012-04-04 6 views
8

Supongamos que la ventana siguiente XAML definido:¿Cómo uso un ItemTemplateSelector junto con un HeaderTemplate en un WPF ListView?

<Window x:Class="LayoutTests.Window1" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:local="clr-namespace:LayoutTests" 
     Title="Window1"> 
    <Window.Resources> 
    <XmlDataProvider x:Key="XmlData" IsInitialLoadEnabled="True"> 
     <x:XData> 
     <Items xmlns=""> 
      <Item text="Item 1" type="A" /> 
      <Item text="Item 2" type="B" /> 
      <Item text="Item 3" type="A" /> 
     </Items> 
     </x:XData> 
    </XmlDataProvider> 
    <DataTemplate x:Key="TypeATemplate"> 
     <TextBlock Text="{Binding XPath=./@text}" Foreground="Red"/> 
    </DataTemplate> 
    <DataTemplate x:Key="TypeBTemplate"> 
     <TextBlock Text="{Binding XPath=./@text}" Foreground="Green"/> 
    </DataTemplate> 
    <DataTemplate x:Key="HeaderTemplate"> 
     <TextBlock Text="A Header"/> 
    </DataTemplate> 
    <local:TypeSelector x:Key="TypeSelector" TypeATemplate="{StaticResource TypeATemplate}" TypeBTemplate="{StaticResource TypeBTemplate}"/> 
    </Window.Resources> 
    <Grid> 
    <ListView ItemsSource="{Binding Source={StaticResource XmlData}, XPath='/Items/Item'}" ItemTemplateSelector="{StaticResource TypeSelector}"> 
     <!--<ListView.View> 
     <GridView> 
      <GridViewColumn Width="Auto" HeaderTemplate="{StaticResource HeaderTemplate}"/> 
     </GridView> 
     </ListView.View>--> 
    </ListView> 
    </Grid> 
</Window> 

Y un DataTemplateSelector se define en el código detrás de la siguiente manera:

public class TypeSelector : DataTemplateSelector 
    { 
    public DataTemplate TypeATemplate { get; set; } 
    public DataTemplate TypeBTemplate { get; set; } 
    public override DataTemplate SelectTemplate(object item, DependencyObject container) 
    { 
     var element = item as XmlElement; 
     if (element.Attributes["type"].Value == "A") 
     return TypeATemplate; 
     else 
     return TypeBTemplate; 
    } 
    } 

Si el código de la plantilla de cabecera no está comentado, la DataTypeSelector no es llamado más. ¿Cómo especifico un DataTemplateSelector y HeaderTemplate al mismo tiempo?

+3

+1 por la excelente preparación de la muestra con la línea de datos XML. ¡Podría usarlo directamente y verificar cuál es tu problema! – SvenG

Respuesta

7

Creo que lo que estás tratando de hacer es diseñar un solo GridViewColumn y su encabezado. Así mover el TemplateSelector del ListView a la definición GridViewColumn:

<Grid> 
    <ListView ItemsSource="{Binding Source={StaticResource XmlData}, XPath='/Items/Item'}"> 
    <ListView.View> 
    <GridView> 
     <GridViewColumn Width="Auto" CellTemplateSelector="{StaticResource TypeSelector}" HeaderTemplate="{StaticResource HeaderTemplate}"/> 
    </GridView> 
    </ListView.View> 
    </ListView> 
</Grid> 
+0

Gracias - eso me estaba poniendo de los nervios. – Pascal

Cuestiones relacionadas