我需要显示分层数据,例如:
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 属性,因此可以轻松执行任何自定义逻辑来展开/折叠元素。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# 中创建并以递归方法手动申请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 ItemsControlby VisualTreeHelper,但之后我不能使用 content as DataTemplate(content has type DependencyObject)。
所以,实际上我有两个问题。通过“绑定”所有项目并仅切换属性
来执行分层下拉列表是否是一种好方法?
第二个是——如何启用无限层次的分层嵌套?Visibility