首页 > 解决方案 > UWP TreeView ItemTempleteSelector 未执行

问题描述

我正在使用的 TreeView 不会执行ItemTemplateSelector,无论我在 XAML 和代码后面声明它。

这是我在 XAML 中的页面资源:

<DataTemplate x:Key="FolderTemplate" x:DataType="localdata:FolderInfo">
        <TreeViewItem ItemsSource="{x:Bind subFolders}">
            <StackPanel Orientation="Horizontal">
                <TextBlock Text="#Folder#" />
                <Image Width="20" Source="Assets/img2.png"/>
                <TextBlock Text="{x:Bind  FolderName }" />
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>

    <DataTemplate x:Key="FileTemplate" x:DataType="localdata:FolderInfo">
        <TreeViewItem>
            <StackPanel Orientation="Horizontal">
                <Image Width="20" Source="Assets/img3.png"/>
                <TextBlock Text="{x:Bind FolderName}"/>
            </StackPanel>
        </TreeViewItem>
    </DataTemplate>


    <localdata:ExplorerItemTemplateSelector
        x:Key="ExplorerItemTemplateSelector"
        FolderTemplate="{StaticResource FolderTemplate}"
        FileTemplate="{StaticResource FileTemplate}" />

这是TreeView声明,它确实使用Style但对本次审查并不重要:

<TreeView   
        x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" 
        Style="{StaticResource TreeViewStyle1}"
        ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}"
        >
            <TreeView.ItemTemplate>
                <DataTemplate x:DataType="localdata:FolderInfo">
                    <TreeViewItem ItemsSource="{x:Bind subFolders}" Content="{x:Bind FolderName}"/>
                </DataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

在我的文件后面的代码中:

public class ExplorerItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
    {
        var explorerItem = (FolderInfo)item;
        if (explorerItem.IsFolder == true) return FolderTemplate;

        return FileTemplate;
    }
}

绑定工作正常。我在这篇评论中省略了 VM 以消除混乱。同样有趣的是,如果我ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}"从 TreeView 的声明中删除,它在视觉或功能上没有任何变化。

标签: xamluwptreeview

解决方案


DataTemplateSelector类型实际上有两个不同的SelectTemplateCore方法重载并TreeView使用第二个,只有一个object参数:

public class ExplorerItemTemplateSelector : DataTemplateSelector
{
    public DataTemplate FolderTemplate { get; set; }
    public DataTemplate FileTemplate { get; set; }

    protected override DataTemplate SelectTemplateCore(object item)
    {
        var explorerItem = (FolderInfo)item;
        if (explorerItem.IsFolder == true) return FolderTemplate;

        return FileTemplate;
    }
}

在这种形式下,应该按预期调用该方法。


推荐阅读