WinRT分层数据显示

时间:2013-01-12 13:18:20

标签: c# xaml windows-runtime hierarchical

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

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

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

我已经用Google搜索了这一点,发现WinRT中没有HierarchicalDataTemplate且没有树视图。
所以我开始自己做 我为它创建了ItemsControlDataTemplate DataTemplate1。在DataTemplate1我还创建了ItemsControl并将DataTemplate2设置为ItemTemplate。在DataTemplate2中,ItemTemplateDataTemplate3,依此类推。最后一个DataTemplate没有ItemsControl

在按钮Click事件中,我为IsVisible中的任何元素(即DataModel)更改了元素Element[]属性,因此很容易执行任何自定义逻辑来展开/ collapse elements。

<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级仍然无法使用。

我还尝试在C#中创建DataTemplate,并在递归方法中为其DataTemplate手动应用ItemSource等等。
但我发现了2个问题。

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

  2. 如果我从XAML(DataTemplate

  3. 阅读var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];

    我仍然无法在其中找到ItemsControl并更改其DataTemplate 实际上,我可以使用var content = dateTemplateRoot.LoadContent();然后按ItemsControl查找VisualTreeHelper,但之后我不能将内容用作DataTemplate(内容类型为DependencyObject

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

1 个答案:

答案 0 :(得分:0)

WinRT XAML Toolkit现在具有TreeView控件。看看:http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/b0ee76bd6492#WinRTXamlToolkit/Controls/TreeView/TreeView.cs

请注意 - 这只是来自Silverlight Toolkit的粗略端口,可能效果不佳。此外,如果您计划将其作为Windows应用商店应用程序的一部分发布 - 除非您的应用仅限于桌面,否则您需要大量重新设置它,因为它不是非常适合触摸的。