我需要顯示等分層數據的WinRT分層數據:顯示
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
屬性用於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層次的層次結構,我必須copypast 10數據模板。 11級仍然無法使用。
我還嘗試在C#中創建DataTemplate
,並在遞歸方法中手動爲其ItemSource
等應用DataTemplate
。
但我發現2個問題。
我真的不知道如何在地鐵(C#)
DataTemplate
,因爲它沒有VisualTree
財產。我只能做(var dt= new Datatemplate();
),我不知道如何改變它。如果我從XAML(
var dateTemplateRoot = (DataTemplate)this.Resources["DataTemplate1"];
)
閱讀DataTemplate
我仍然無法找到它ItemsControl
並改變其DataTemplate
。其實,我可以使用var content = dateTemplateRoot.LoadContent();
,然後通過VisualTreeHelper
找到ItemsControl
,但是我不能使用內容之後的內容作爲DataTemplate
(內容的類型爲DependencyObject
)。
所以,其實我有2個問題。
通過「綁定」所有項目並僅切換Visibility
屬性來執行分層下拉列表是否是一種好方法?
第二個是 - 如何啓用無限級別的嵌套層次?
查看Silverlight 3的Silverlight工具包 - SL3中沒有HierarchicalDataTemplate,但工具包提供了一個和TreeView。 –