2012-04-04 33 views
8

Giả sử cửa sổ XAML sau định nghĩa:Làm thế nào để sử dụng một ItemTemplateSelector cùng với một HeaderTemplate trong một ListView WPF?

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

Và một DataTemplateSelector quy định tại mã đằng sau như thế này:

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

Nếu mã cho mẫu tiêu đề không được nhận xét ra, các DataTypeSelector không phải là được gọi nữa. Làm cách nào để chỉ định DataTemplateSelectorHeaderTemplate cùng một lúc?

+3

+1 cho việc chuẩn bị tuyệt vời của mẫu của bạn với nội tuyến dữ liệu XML. Có thể sử dụng trực tiếp và kiểm tra xem vấn đề của bạn là gì !!! – SvenG

Trả lời

7

Tôi nghĩ rằng những gì bạn đang cố gắng làm là tạo kiểu một GridViewColumn và Tiêu đề của nó. Vì vậy, di chuyển TemplateSelector từ ListView để định nghĩa 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> 
+0

Cảm ơn - điều đó đã làm tôi lo lắng. – Pascal

Các vấn đề liên quan