xaml - 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 的声明中删除,它在视觉或功能上没有任何变化。
解决方案
该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;
}
}
在这种形式下,应该按预期调用该方法。
推荐阅读
- c - 自定义 PAM 在 SSH 中的 PAM_CONVERSATION 失败
- python - AttributeError:'tuple'对象没有属性'write',实例分割python
- html - CSS 意味着覆盖,但为什么某些 css 类会覆盖它
- c# - 如何将 TabbedPage 与 MasterDetailPage 与 MvvmCross 演示者一起使用?
- arrays - Kotlin:我想在数组不在“if”时更新一个字母数组。当数组更新离开“if”时,如何保持更新?
- docusaurus - 在 Docusaurus 中找不到页面
- filter - 带有过滤器的谷歌电子表格交叉数据不起作用
- google-sheets - 如何使用谷歌电子表格生成特定年份的随机出生日期数据?
- python - 使用 Keras 中的功能 API 向 GRU 模型添加遮罩层的正确方法?
- c++ - BOOST 1.73.0 进程间字符串分配器错误