我需要显示分层数据,例如:
public class Element
{
public string Name { get; private set; }
public Element[] Elements { get; private set; }
}
Name
对于每个元素,它只是带有矩形(带有 )的垂直面板。如果单击元素,则其子元素将显示在其下方(元素已展开)。如果单击其中之一,则会出现其元素,依此类推。
我已经用谷歌搜索了这个,发现 WinRT 中没有 HierarchicalDataTemplate 和树视图。
于是我开始自己做。
我创造ItemsControl
了DataTemplate
DataTemplate1
它。在DataTemplate1
我也创建ItemsControl
并设置DataTemplate2
为ItemTemplate
. 在DataTemplate2
,ItemTemplate
是DataTemplate3
等等。最后DataTemplate
是没有ItemsControl
。
在按钮Click
事件中,我更改(即)IsVisible
中任何元素的 Elements 属性,因此可以轻松执行任何自定义逻辑来展开/折叠元素。DataModel
Element[]
<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# 中创建并以递归方法手动申请DataTemplate
它ItemSource
等等。
但是我发现了2个问题。
我实际上不知道如何
DataTemplate
在 Metro (C#) 中创建,因为它没有VisualTree
属性。我只能制作(var dt= new Datatemplate();
),我不知道如何改变它。如果我
DataTemplate
从 XAML (var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];
)中读取
我仍然无法ItemsControl
在其中找到并更改其DataTemplate
.
实际上,我可以使用var content = dateTemplateRoot.LoadContent();
然后 find ItemsControl
by VisualTreeHelper
,但之后我不能使用 content as DataTemplate
(content has type DependencyObject
)。
所以,实际上我有两个问题。通过“绑定”所有项目并仅切换属性
来执行分层下拉列表是否是一种好方法?
第二个是——如何启用无限层次的分层嵌套?Visibility