我该如何在WPF ListView中同时使用ItemTemplateSelector和HeaderTemplate?

9
假设有以下定义的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?

4
感谢您出色地准备了带有行内XML数据的样本,我可以直接使用它并检查您遇到的问题!!!(原意不变) - SvenG
1个回答

8

我认为您尝试的是给单个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>

1
谢谢 - 那真的让我很烦。 - Pascal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接