wpf - DataTemplateSelector 不会被使用

标签 wpf templates listview datatemplate datatemplateselector

为了根据当前的 Item 类型在 ListView 中的两个 ItemTemplates 之间切换,我实现了一个 DataTemplateSelector。我通过 Binding 将其添加到 ListView 中。但如果我设置了一个断点,它就永远不会被调用。我尝试了一切,但没有任何效果。

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}" />

有人知道如何解决这个问题吗?

谢谢R

最佳答案

来自GridView Overview > GridView Layout and Style > 在 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.

因此,您必须从 GridViewColumns 中删除 DisplayMemberBinding 并设置 CellTemplateSelector而不是 ListView 的 ItemTemplateSelector:

<GridView>
    <GridViewColumn Header="ID" Width="100"
                    CellTemplateSelector="{StaticResource TemplateSelector}"/>
    <GridViewColumn Header="Value" Width="300"
                    DisplayMemberBinding="{Binding Value}"/>
</GridView>

关于wpf - DataTemplateSelector 不会被使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16875274/

相关文章:

c# - 如何在 XAML 中动态访问元素名称?

android - 如何检测 ListView 项目变为 ActiveView(离开屏幕)的时刻

java - 使用自定义 ListView 布局中的按钮增加 Int 的值

wpf - 使用自定义列启用 DataGrid 复制

c# - Wpf DataGrid 只显示空行

c++ - 将函数放入模板

templates - 如何将模板输出写入 Golang 中的文件?

c++ - GCC 7 没有选择正确的类型特征特化

android - 收到新短信时,短信接收应用程序崩溃 - Android

c# - WPF 服务器应用程序