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;
}
}
在这种形式下,应该按预期调用方法。
我正在处理的 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;
}
}
在这种形式下,应该按预期调用方法。