Вопрос

To switch between two ItemTemplates in my ListView based on the current Item type, I implemented a DataTemplateSelector. I added it via Binding to the ListView. But if I set a breakpoint, it never gets called. I tried everything, nothing works.

public class ListViewTemplateSelector : DataTemplateSelector
{
    public DataTemplate SectionTemplate { get; set; }
    public DataTemplate EntryTemplate { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is Section)
        {
            return SectionTemplate;
        }

        if (item is Entry)
        {
            return EntryTemplate;
        }

        return base.SelectTemplate(item, container);
    }
}

XAML:

<ListView DataContext="{Binding ElementName=This}" x:Name="list" Margin="200,25,0,0" ItemsSource="{Binding CurrentSelection}" ItemTemplateSelector="{StaticResource TemplateSelector}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="ID" DisplayMemberBinding="{Binding ID}" Width="100" />
            <GridViewColumn Header="Value" DisplayMemberBinding="{Binding Value}" Width="300" />
        </GridView>
    </ListView.View>
</ListView>

<DataTemplate x:Key="sectionTemplate">
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Source="\Icons\blue-folder.png" />
        <TextBlock Text="{Binding ID}" Margin="5,0,0,0" />
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="entryTemplate">
    <StackPanel Orientation="Horizontal">
        <Image Width="16" Height="16" Source="\Icons\ui-text-field-medium.png" />
        <TextBlock Text="{Binding ID}" Margin="5,0,0,0" />
    </StackPanel>
</DataTemplate>

<sdk:ListViewTemplateSelector x:Key="TemplateSelector" SectionTemplate="{StaticResource sectionTemplate}" EntryTemplate="{StaticResource entryTemplate}" />

Has anybody an idea how to fix that?

Thanks R

Это было полезно?

Решение

From GridView Overview > GridView Layout and Style > Defining and Styling Columns in a GridView:

When defining the data field to display in a GridViewColumn, use the DisplayMemberBinding, CellTemplate, or CellTemplateSelector properties. The DisplayMemberBinding property takes precedence over either of the template properties.

Hence you would have to remove the DisplayMemberBinding from your GridViewColumns and set the CellTemplateSelector instead of the ListView's ItemTemplateSelector:

<GridView>
    <GridViewColumn Header="ID" Width="100"
                    CellTemplateSelector="{StaticResource TemplateSelector}"/>
    <GridViewColumn Header="Value" Width="300"
                    DisplayMemberBinding="{Binding Value}"/>
</GridView>
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top