我看到Windows Phone工具包具有一个称为HierarchicalDataTemplate
的元素。这对我很有好处,因为我想构建一个树形结构。
我已经看到HierarchicalDataTemplate
也包含在WPF中。这使我在这里使用本文:TreeView, HierarchicalDataTemplate and recursive Data
它指出您应该在数据模板上设置TargetType
。但是Windows Phone Toolkit中的HierarchicalDataTemplate
没有该属性。
而且,我想知道HierarchicalDataTemplate
的含义是什么,因为似乎也没有TreeView
控件。
最佳答案
有趣的问题,我刚刚检查了一下,的确,本机WP8中没有HierarchicalDataTemplate,但它在WPToolkit中。检查源代码后,仅在HeaderedItemsControl中使用它,它是ExpanderView和MenuItem的父级。
有趣的是,HierarchicalDataTemplate中的ItemsSource,ItemTemplate和ItemContainerStyle属性甚至都不是DependencyProperties,并且甚至在任何WPToolkit示例中都没有分配它们。我不确定此HierarchicalDataTemplate实际上是否可用于创建递归数据结构。
但是没关系,完全可以仅使用本机WP8类来构建自己的递归数据结构:
让我们使用带有节点集合的简单递归类Node和MainViewModel:
public class Node
{
public string Title { get; set; }
public ObservableCollection<Node> Children { get; set; }
}
public class MainViewModel
{
public ObservableCollection<Node> Nodes { get; set; }
public MainViewModel()
{
Nodes = ... // load the structure here
}
}
让我们创建用于递归显示节点的UserControl和MainPage的一些代码。
<UserControl x:Class="WP8.HierarchicalDataTemplate.NodeUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:h="clr-namespace:WP8.HierarchicalDataTemplate">
<Border BorderThickness="1" BorderBrush="Red">
<StackPanel d:DataContext="{d:DesignInstance h:Node}" Margin="15">
<TextBlock Text="{Binding Title}" />
<ItemsControl ItemsSource="{Binding Children}"
ItemTemplate="{StaticResource NodeNestedTemplate}" />
</StackPanel>
</Border>
</UserControl>
<!-- on MainPage as root object -->
<Grid>
<ItemsControl Margin="20"
ItemsSource="{Binding Nodes, Source={StaticResource model}}"
ItemTemplate="{StaticResource NodeNestedTemplate}" />
</Grid>
注意,我们在NodeUserControl和MainPage DataTemplate中都使用了名为NodeNestedTemplate的模板。我们不能像这样定义递归的DataTemplate,但是我们可以创建使用此DataTemplate并也放置在此DataTemplate中的UserControl-这位于App.xaml的全局资源中:
...
xmlns:h="clr-namespace:WP8.HierarchicalDataTemplate">
<Application.Resources>
<h:MainViewModel x:Key="model"/>
<DataTemplate x:Key="NodeNestedTemplate">
<h:NodeUserControl />
</DataTemplate>
</Application.Resources>
...
就这样!这是使用具有3个递归级别的数据源时解决方案的小屏幕截图:http://i.stack.imgur.com/zqOYe.png
希望它可以帮助您实现Tree结构!