这个问题的WPF版本是这里:但是还没有得到解答,我不知道UWP TreeView是否会有相同的答案。
我正在尝试将 DataTemplateSelector 添加到刚刚添加到 Windows 10 版本 1803 的新 UWP TreeView,但它不起作用。 here记录了如何使用 XAML TreeView 控件,甚至展示了如何修改模板以更改项目数据模板,效果很好。我需要使用数据模板选择器,因为我的每个节点都使用不同的对象,并且我需要它们以不同的方式显示。 TreeView.Node.Content 设置得很好,除了将 null 传递给对象参数中的 datatemplateselector 之外,一切正常。
这是我的代码:(与 Microsoft 的示例相同,只是使用 ItemTemplateSelector)
<Style TargetType="TreeView">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<TreeViewList x:Name="ListControl"
ItemTemplateSelector="{StaticResource CardSelector}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
CanDragItems="True"
AllowDrop="True"
CanReorderItems="True">
<TreeViewList.ItemContainerTransitions>
<TransitionCollection>
<ContentThemeTransition />
<ReorderThemeTransition />
<EntranceThemeTransition IsStaggeringEnabled="False" />
</TransitionCollection>
</TreeViewList.ItemContainerTransitions>
</TreeViewList>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
有人对此有任何见解或经验吗?我的数据模板选择器“CardSelector”工作正常,我已经在几个地方使用它,没有任何问题。
所以我的问题的重点不是得到任何我正在工作的东西,而是看看 TreeViewControl 是否与 DataTemplateSelector 一起工作。我那里只有“CardTemplateSelector”,因为我在应用程序的其他几个地方使用它,并且我知道它有效。我的问题实际上是“是的,树视图可以与选择器一起使用”或“不,它不能”我真的在寻找其他人使用他们自己的测试模板选择器进行尝试,并让我知道他们是否可以使其工作。我的任何具体代码与该问题无关。只是看看你是否可以让它与你想要的任何选择器一起工作
是的。 TreeView 与
ItemTemplateSelector
配合得很好。
我使用了文档中的所有代码并创建了一个自定义类,如下所示:
public class Test
{
public string Name { get; set; }
}
我制作了另一个这样的数据模板:
<DataTemplate x:Key="TreeViewObjDataTemplate">
<Grid Height="44">
<TextBlock
Text="{Binding Content.Name}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Style="{ThemeResource BodyTextBlockStyle}"/>
</Grid>
</DataTemplate>
我的
CardTemplateSelector
课程如下:
public class CardTemplateSelector: DataTemplateSelector
{
public DataTemplate TreeViewItemDataTemplate { get; set; }
public DataTemplate TreeViewObjDataTemplate { get; set; }
protected override DataTemplate SelectTemplateCore(object item)
{
TreeViewNode treeViewNode = item as TreeViewNode;
if (treeViewNode.Content is StorageFolder|| treeViewNode.Content is StorageFile)
{
return TreeViewItemDataTemplate;
}
if (treeViewNode.Content is Test)
{
return TreeViewObjDataTemplate;
}
return base.SelectTemplateCore(item);
}
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
return SelectTemplateCore(item);
}
}
我只是在
MainPage.xaml.cs
中添加新行代码:
TreeViewNode objnode = new TreeViewNode();
Test test = new Test() {Name="Parent"};
objnode.Content = test;
objnode.IsExpanded = true;
objnode.HasUnrealizedChildren = true;
sampleTreeView.RootNodes.Add(objnode);
以下是整个xaml页面资源代码:
<Page.Resources>
<DataTemplate x:Key="TreeViewItemDataTemplate">
<Grid Height="44">
<TextBlock
Text="{Binding Content.DisplayName}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Style="{ThemeResource BodyTextBlockStyle}"/>
</Grid>
</DataTemplate>
<DataTemplate x:Key="TreeViewObjDataTemplate">
<Grid Height="44">
<TextBlock
Text="{Binding Content.Name}"
HorizontalAlignment="Left"
VerticalAlignment="Center"
Style="{ThemeResource BodyTextBlockStyle}"/>
</Grid>
</DataTemplate>
<local:CardTemplateSelector x:Name="CardTemplateSelector" TreeViewItemDataTemplate="{StaticResource TreeViewItemDataTemplate}" TreeViewObjDataTemplate="{StaticResource TreeViewObjDataTemplate}"></local:CardTemplateSelector>
<Style TargetType="TreeView">
<Setter Property="IsTabStop" Value="False" />
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="TreeView">
<TreeViewList x:Name="ListControl"
ItemTemplateSelector="{StaticResource CardTemplateSelector}"
ItemContainerStyle="{StaticResource TreeViewItemStyle}"
CanDragItems="True"
AllowDrop="True"
CanReorderItems="True">
<TreeViewList.ItemContainerTransitions>
<TransitionCollection>
<ContentThemeTransition />
<ReorderThemeTransition />
<EntranceThemeTransition IsStaggeringEnabled="False" />
</TransitionCollection>
</TreeViewList.ItemContainerTransitions>
</TreeViewList>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
</Page.Resources>
对于在哪里应用 DataTemplate 似乎存在困惑。并且所有重要的 TargetType 都会被忽略。
如果您想要自定义 DataTemplateSelector 中数据项的句柄,您需要:
选项 1
只有这样,TreeViewNode 的数据项才会提供给自定义 DataTemplateSelector 的 SetTemplateCore(object item) 和 SetTemplateCore(object item, DependencyObject container) 覆盖。 在这里可以找到一个工作示例:图片和音乐库树视图
选项 2
<TreeView.ItemTemplate>
<DataTemplate x:DataType="[YOUR-DATA-TYPE]">
<TreeViewItem DataContext="{Binding}" ... Content="{Binding}">
<TreeViewItem.ContentTemplateSelector>
<YourDataTemplateSelector.TemplateA>
<DataTemplate x:DataType="[YOUR-DATA-TYPE]">
...
// YourDataTemplateSelector
protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)
{
if (item == null) return null;
return (([YOUR-DATA-TYPE])item).IsSomething ? TemplateA : TemplateB;
}