UWP TreeView的ItemTemplateSelector无法正常工作求助
我之前也碰到过Win10 1803版本新增的UWP TreeView里DataTemplateSelector接收参数为空的情况,结合你的代码和场景,给你几个可行的排查方向和解决方案:
1. 修复TreeViewList的ItemsSource绑定
你重写TreeView的ControlTemplate时,漏掉了TreeViewList和TreeView核心数据的绑定逻辑。默认的TreeView模板中,TreeViewList的ItemsSource是绑定到TreeView的Items属性的,没有这个绑定的话,TreeViewList无法正确获取到你的TreeViewNode集合,自然传递给Selector的对象就是空的。
修改你的TreeViewList定义,加上ItemsSource绑定:
<TreeViewList x:Name="ListControl" ItemsSource="{TemplateBinding Items}" ItemContainerStyle="{StaticResource TreeViewItemStyle}" CanDragItems="True" AllowDrop="True" CanReorderItems="True"> <TreeViewList.ItemContainerTransitions> <TransitionCollection> <ContentThemeTransition /> <ReorderThemeTransition /> <EntranceThemeTransition IsStaggeringEnabled="False" /> </TransitionCollection> </TreeViewList.ItemContainerTransitions> </TreeViewList>
2. 将DataTemplateSelector移到TreeViewItem的Style中
TreeViewList的ItemTemplateSelector作用的是TreeViewNode本身,而非TreeViewNode的Content属性。你需要把Selector配置到TreeViewItem的ContentTemplateSelector上,这样它才会针对每个节点的Content对象进行模板选择。
修改你的TreeViewItemStyle:
<Style x:Key="TreeViewItemStyle" TargetType="TreeViewItem"> <!-- 保留你原有的其他Setter设置 --> <Setter Property="ContentTemplateSelector" Value="{StaticResource CardSelector}" /> </Style>
同时记得移除TreeViewList上的ItemTemplateSelector设置,避免冲突。
3. 确保TreeViewNode的Content/DataContext正确关联
如果你是手动创建TreeViewNode并设置Content,建议同时把Content赋值给DataContext,确保数据上下文能正确传递给Selector:
var dataNode = new YourCustomDataObject(); // 你的业务对象 var treeNode = new TreeViewNode { Content = dataNode, DataContext = dataNode // 显式设置DataContext };
虽然理论上TreeViewItem会自动把Content作为DataContext,但显式设置能避免一些边界场景下的上下文丢失问题。
这些步骤应该能解决你遇到的问题——毕竟你的CardSelector在其他场景正常工作,说明Selector本身逻辑没问题,问题出在TreeView的模板绑定和Selector的配置位置上。
内容的提问来源于stack exchange,提问作者beatnikthedan

