UWP TreeView ItemTempleteSelector 未执行

UWP TreeView ItemTempleteSelector is not executed

我正在处理的 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 以消除混乱。同样有趣的是,如果我从 TreeView 的声明中删除 ItemTemplateSelector="{StaticResource ExpolrerItemTemplateSelector}",它在视觉或功能意义上没有任何变化。

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

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