Как использовать ItemTemplateSelector вместе с HeaderTemplate в WPF ListView?
Предположим следующее окно, определенное XAML:
<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>
И DataTemplateSelector
определяется в коде, как это:
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;
}
}
Если код для шаблона заголовка не закомментирован, DataTypeSelector больше не вызывается. Как мне указать DataTemplateSelector
а также HeaderTemplate
в то же время?
1 ответ
Решение
Я думаю, что вы пытаетесь сделать стиль одного GridViewColumn и его заголовка. Поэтому переместите TemplateSelector из ListView в определение 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>