我需要显示分层数据,如:
public class Element
{
public string Name { get; private set; }
public Element[] Elements { get; private set; }
}
对于每个元素,它只是带有矩形(带Name
)的垂直面板。如果单击元素,则其子元素将显示在其下方(元素已展开)。如果单击其中一个,则会显示其元素,依此类推。
我已经用Google搜索了这一点,发现WinRT中没有HierarchicalDataTemplate且没有树视图。
所以我开始自己做
我为它创建了ItemsControl
和DataTemplate
DataTemplate1
。在DataTemplate1
我还创建了ItemsControl
并将DataTemplate2
设置为ItemTemplate
。在DataTemplate2
中,ItemTemplate
为DataTemplate3
,依此类推。最后一个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个问题。
我实际上并不知道如何在metro(C#)中创建DataTemplate
,因为它没有VisualTree
属性。我只能制作(var dt= new Datatemplate();
)并且我不知道如何更改它。
如果我从XAML(DataTemplate
)
var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];
醇>
我仍然无法在其中找到ItemsControl
并更改其DataTemplate
实际上,我可以使用var content = dateTemplateRoot.LoadContent();
然后按ItemsControl
查找VisualTreeHelper
,但之后我不能将内容用作DataTemplate
(内容类型为DependencyObject
)
所以,实际上我有两个问题
通过“绑定”所有项目并仅切换Visibility
属性来执行分层下拉列表是一种好方法吗?
第二个是 - 如何启用无限级别的分层嵌套?
答案 0 :(得分:0)
WinRT XAML Toolkit现在具有TreeView
控件。看看:http://winrtxamltoolkit.codeplex.com/SourceControl/changeset/view/b0ee76bd6492#WinRTXamlToolkit/Controls/TreeView/TreeView.cs
请注意 - 这只是来自Silverlight Toolkit的粗略端口,可能效果不佳。此外,如果您计划将其作为Windows应用商店应用程序的一部分发布 - 除非您的应用仅限于桌面,否则您需要大量重新设置它,因为它不是非常适合触摸的。