2009-02-26 79 views
0

如果我有一個DataSet作爲SQL查詢的結果,我可以直接將它綁定到TreeView並顯示我的數據層次結構嗎?我知道我必須使用幾個HierarchicalDataTemplates,但我不知道如何告訴每個HierarchicalDataTemplates顯示哪些數據。如何將數據集直接綁定到TreeView(具有層次結構)?

如果我有一個4級的層次,就像這樣:

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="SecondLevelTemplate" ItemTemplate="{StaticResource ThirdLevelTemplate}"/> 
<HierarchicalDataTemplate x:Key="ThirdLevelTemplate" ItemTemplate="{StaticResource FourthLevelTemplate}"/> 
<DataTemplate x:Key="FourthLevelTemplate"/> 

什麼財產(IES)需要被設置爲直接從數據集顯示我的數據?

編輯:理想情況下,我想這樣做使用一個自引用DataTable。

回答

1

我不認爲你可以做到這一點。

Treeview控件和HierarchicalDataTemplate期望對象的層次結構。 DataSet本質上是平坦的。

您將不得不以某種方式將該數據集轉換爲對象的層次結構,每個對象都有自己的「Children」集合。 TreeView的ItemsSource將被綁定到「頂級集合」(沒有父引用的行)。

每個HierarchicalDataTemplate都將其ItemsSource屬性綁定到相應的Children屬性。

可能有一種使用轉換器的解決方案,但是如果存在的話,它可能最終比直接在綁定之前重塑數據更復雜。

0

首先,您需要將TreeView的ItemsSource設置爲DataSet。

接下來,您將設置TreeView的ItemTemplate爲FirstLevelTemplate。

ItemTemplate="{StaticResource FirstLevelTemplate}" 

第一個模板必須引用將使用第二級模板的項目。一個項目源添加該層級的模板,像這樣:

<HierarchicalDataTemplate x:Key="FirstLevelTemplate" ItemsSource="{Binding ChildItems}" ItemTemplate="{StaticResource SecondLevelTemplate}"/> 

更改「ChildItems」是指包含子項的DataSet中的財產。對每個HierarchicalDataTemplate重複此操作。

最後,您需要將控件添加到DataTemplates以顯示數據。這裏有一個簡單的例子:

<DataTemplate x:Key="FourthLevelTemplate"/> 
    <Border BorderThickness="1" BorderBrush="Gray" CornerRadius="3"> 
     <TextBlock Text="{Binding DataProperty}" 
       HorizontalAlignment="Center" VerticalAlignment="Center"/> 
    </Border> 
</DataTemplate> 

在這種情況下,你將取代「DataProperty」與您的數據字段的屬性名稱。請注意,您可以添加其他控件(如TextBox,ComboBox等)以顯示其他數據。

+0

有什麼辦法可以設置二級兒童的控制模板嗎? – Echilon 2009-10-18 13:48:33

+0

我的建議是爲每個級別創建一個HierarchicalDataTemplate。第二層將被稱爲「SecondLevelTemplate」。此模板中的控件將顯示在第二級。如果你想要一個「ControlTemplate」,使用DataTemplate中的Control並在其上設置Template屬性。 – 2009-10-21 20:07:27

相關問題