2012-04-04 3 views
8

das folgende XAML definiert Fenster Angenommen:Wie verwende ich einen ItemTemplateSelector zusammen mit einem HeaderTemplate in einem 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> 

Und ein DataTemplateSelector im Code definiert hinter wie folgt aus:

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

Wenn der Code für den Template-Header nicht kommentiert geführt wird, ist die DataTypeSelector nicht rief mehr an. Wie gebe ich gleichzeitig DataTemplateSelector und HeaderTemplate an?

+3

+1 für die hervorragende Vorbereitung Ihrer Probe mit dem Inline-XML-Daten. Könnte es direkt benutzen und überprüfen, was dein Problem ist !!! – SvenG

Antwort

7

Ich denke, was Sie versuchen, ist eine einzelne GridViewColumn und seinen Header zu stylen. So den TemplateSelector aus dem Listview auf die Gridviewcolumn Definition bewegen:

<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

Danke - das ging mir auf die Nerven. – Pascal

Verwandte Themen