1

我需要显示分层数据,例如:

public class Element
{
    public string Name { get; private set; }
    public Element[] Elements { get; private set; }
}

Name对于每个元素,它只是带有矩形(带有 )的垂直面板。如果单击元素,则其子元素将显示在其下方(元素已展开)。如果单击其中之一,则会出现其元素,依此类推。

我已经用谷歌搜索了这个,发现 WinRT 中没有 HierarchicalDataTemplate 和树视图。
于是我开始自己做。
我创造ItemsControlDataTemplate DataTemplate1它。在DataTemplate1我也创建ItemsControl并设置DataTemplate2ItemTemplate. 在DataTemplate2ItemTemplateDataTemplate3等等。最后DataTemplate是没有ItemsControl

在按钮Click事件中,我更改(即)IsVisible中任何元素的 Elements 属性,因此可以轻松执行任何自定义逻辑来展开/折叠元素。DataModelElement[]

<DataTemplate x:Key="DataTemplate2">
    <StackPanel Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Button  Style="{StaticResource ItemButtonStyle}"
                 Click="MenuElement_Click">
            <TextBlock Style="{StaticResource ItemTextBlockStyle}" Text="{Binding Name}"/>
        </Button>
        <ItemsControl ItemsSource="{Binding Elements}" ItemTemplate="{StaticResource DataTemplate3}"/>
    </StackPanel>
</DataTemplate>

<DataTemplate x:Key="DataTemplate1">
    <StackPanel Visibility="{Binding IsVisible, Converter={StaticResource BooleanToVisibilityConverter}}">
        <Button  Style="{StaticResource ItemButtonStyle}"
                 Click="MenuElement_Click">
            <TextBlock Style="{StaticResource ItemTextBlockStyle}" Text="{Binding Name}"/>
        </Button>
        <ItemsControl ItemsSource="{Binding Elements}" ItemTemplate="{StaticResource DataTemplate2}"/>
    </StackPanel>
</DataTemplate>

它工作正常,但问题是如果我想启用 10 级层次结构,我必须复制过去 10 个数据模板。11级仍然不可用。

我还尝试DataTemplate在 C# 中创建并以递归方法手动申请DataTemplateItemSource等等。
但是我发现了2个问题。

  1. 我实际上不知道如何DataTemplate在 Metro (C#) 中创建,因为它没有VisualTree属性。我只能制作(var dt= new Datatemplate();),我不知道如何改变它。

  2. 如果我DataTemplate从 XAML ( var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];)中读取

我仍然无法ItemsControl在其中找到并更改其DataTemplate.
实际上,我可以使用var content = dateTemplateRoot.LoadContent();然后 find ItemsControlby VisualTreeHelper,但之后我不能使用 content as DataTemplate(content has type DependencyObject)。

所以,实际上我有两个问题。通过“绑定”所有项目并仅切换属性
来执行分层下拉列表是否是一种好方法? 第二个是——如何启用无限层次的分层嵌套?Visibility

4

1 回答 1

0

WinRT XAML ToolkitTreeView现在有一个控件。检查出来:http ://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/b0ee76bd6492#WinRTXamlToolkit/Controls/TreeView/TreeView.cs

不过要小心 - 这只是 Silverlight Toolkit 的一个粗略移植,可能效果不佳。此外,如果您计划将其作为 Windows 应用商店应用程序的一部分发布 - 您将需要对其进行大量重新设计,除非您的应用程序仅适用于桌面,因为它不是很适合触控。

于 2013-02-28T16:54:44.817 回答