Wie verwende ich einen ItemTemplateSelector zusammen mit einer HeaderTemplate in einer WPF-ListView?
Angenommen, das folgende XAML-definierte Fenster:
<code><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> </code>
Und einDataTemplateSelector
definiert im Code dahinter wie folgt:
<code> 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; } } </code>
Wenn der Code für die Header-Vorlage nicht auskommentiert ist, wird der DataTypeSelector nicht mehr aufgerufen.Wie gebe ich einDataTemplateSelector
undHeaderTemplate
zur selben Zeit?