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?

 SvenG04. Apr. 2012, 13:57
+1 für die hervorragende Aufbereitung Ihrer Probe mit den Inline-XML-Daten. Könnte es direkt verwenden und überprüfen, was Ihr Problem ist !!!

Antworten auf die Frage(1)

Lösung für das Problem

Sie versuchen, eine einzelne GridViewColumn und deren Header zu formatieren. Verschieben Sie den TemplateSelector aus der ListView in die GridViewColumn-Definition:

<code><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>
</code>
 Pascal04. Apr. 2012, 14:01
Danke - das ging mir auf die Nerven.

Ihre Antwort auf die Frage