How to use ItemTemplateSelector together with HeaderTemplate in WPF ListView?

Assume the following XAML window:

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

And a DataTemplateSelector defined in the code below:

  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; } } 

If the header template code is not commented out, the DataTypeSelector is no longer called. How to specify a DataTemplateSelector and HeaderTemplate at the same time?

+8
listview wpf datatemplate
source share
1 answer

I think you are trying to create a GridViewColumn style and its title. Therefore, move the TemplateSelector from the ListView to the GridViewColumn definition:

 <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> 
+7
source share

All Articles