UWP TreeView的ItemTemplateSelector未执行问题求助
UWP TreeView ItemTemplateSelector 不生效的问题排查与解决
嘿,我一眼就揪出问题所在了——你犯了两个容易忽略的小错误,直接导致模板选择器完全没被触发:
1. TreeView 同时设置了 ItemTemplate 和 ItemTemplateSelector
UWP 的 TreeView 有个优先级规则:如果同时声明了 ItemTemplate 和 ItemTemplateSelector,ItemTemplate 会被优先使用,你的 ExplorerItemTemplateSelector 根本没机会执行。这就是为什么你移除Selector声明后,界面完全没变化——因为一直都是ItemTemplate在起作用!
2. ItemTemplateSelector 的资源Key拼写错误
你在TreeView里写的是 ExpolrerItemTemplateSelector(注意少了个字母'r'),但你在资源里定义的Key是 ExplorerItemTemplateSelector,这个拼写错误会导致系统找不到你的选择器资源,就算前面的问题解决了,Selector也不会生效。
修正后的代码
首先,把TreeView里的ItemTemplate整个删掉,然后修正拼写错误:
<TreeView x:Name="treeview" Grid.Row="2" ItemsSource="{Binding storageFolders,Mode=OneWay}" Style="{StaticResource TreeViewStyle1}" ItemTemplateSelector="{StaticResource ExplorerItemTemplateSelector}" > </TreeView>
额外优化建议(可选)
你现在的DataTemplate里直接嵌套了TreeViewItem,虽然能工作,但其实更规范的做法是让模板只包含内容部分,TreeView会自动把内容包装成TreeViewItem。比如把你的FolderTemplate改成这样:
<DataTemplate x:Key="FolderTemplate" x:DataType="localdata:FolderInfo"> <StackPanel Orientation="Horizontal"> <TextBlock Text="#Folder#" /> <Image Width="20" Source="Assets/img2.png"/> <TextBlock Text="{x:Bind FolderName }" /> </StackPanel> </DataTemplate>
如果需要控制TreeViewItem的样式(比如展开/折叠行为、选中状态),可以用TreeView.ItemContainerStyle来设置,这样代码结构会更清晰。
按这个修改后,你的模板选择器应该就能正常根据IsFolder字段选择对应的模板了!
内容的提问来源于stack exchange,提问作者VladacusB
相关产品推荐
相关产品推荐

