Windows Phone使用HierarchicalDataTemplate进行递归?

Mat*_*zen 3 c# windows-phone windows-phone-8

我看到Windows Phone Toolkit有一个名为a的元素HierarchicalDataTemplate.这对我有好处,因为我想构建一个树形结构.

我已经看到它HierarchicalDataTemplate也包含在WPF中.这让我在这里使用这篇文章:TreeView,HierarchicalDataTemplate和递归数据

它声明您应该TargetType在数据模板上设置.但是HierarchicalDataTemplateWindows Phone Toolkit中没有该属性.

而且,我想知道它HierarchicalDataTemplate是什么,因为似乎也没有TreeView控制权.

Mar*_*han 6

有趣的问题,我刚刚检查过,确实在原生WP8中没有HierarchicalDataTemplate,但它在WPToolkit中.检查源代码后,它仅在HeaderedItemsControl中使用,它是ExpanderView和MenuItem的父级.
有意义的是,HierarchicalDataTemplate中的ItemsSource,ItemTemplateItemContainerStyle属性甚至不是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
    }
}
Run Code Online (Sandbox Code Playgroud)

让我们创建用于递归显示节点的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>
Run Code Online (Sandbox Code Playgroud)

注意我们在NodeUserControl和名为NodeNestedTemplate的 MainPage DataTemplate上都使用了它们.我们不能像这样定义递归DataTemplate,但我们可以创建使用此DataTemplate的UserControl并放置在此DataTemplate中 - 这是在App.xaml中的全局资源中:

...
xmlns:h="clr-namespace:WP8.HierarchicalDataTemplate">

<Application.Resources>
    <h:MainViewModel x:Key="model"/>
    <DataTemplate x:Key="NodeNestedTemplate">
        <h:NodeUserControl />
    </DataTemplate>
</Application.Resources>
...
Run Code Online (Sandbox Code Playgroud)

就这样!以下是使用具有3级递归的数据源时解决方案的小屏幕截图:http://i.stack.imgur.com/zqOYe.png

希望它可以帮助您实现树结构!