【发布时间】:2012-12-26 22:50:47
【问题描述】:
我需要显示分层数据,例如:
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 事件中,我更改DataModel(即Element[])中任何元素的Elements IsVisible 属性,因此可以轻松执行任何自定义逻辑来展开/折叠元素。
<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 并以递归方法手动为其 ItemSource 应用 DataTemplate 等等。
但是我发现了2个问题。
我实际上不知道如何在 Metro (C#) 中创建
DataTemplate,因为它没有VisualTree属性。我只能做(var dt= new Datatemplate();),不知道怎么改。如果我从 XAML 中读取
DataTemplate(var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];)
我仍然无法在其中找到ItemsControl 并更改其DataTemplate。
实际上,我可以使用var content = dateTemplateRoot.LoadContent();,然后通过VisualTreeHelper 找到ItemsControl,但之后我不能使用DataTemplate 的内容(内容类型为DependencyObject)。
所以,实际上我有 2 个问题。
通过“绑定”所有项目并仅切换 Visibility 属性来执行分层下拉列表是否是一种好方法?
第二个是——如何实现无限层级的分层嵌套?
【问题讨论】:
-
查看 Silverlight 3 的 Silverlight 工具包 - SL3 中没有 HierarchicalDataTemplate,但该工具包提供了一个和 TreeView。
标签: c# xaml windows-runtime hierarchical