如何将数据集直接绑定到TreeView(具有层次结构)?

时间:2009-02-26 20:38:21

标签: wpf data-binding xaml treeview

如果我在SQL查询中有一个DataSet,我可以将它直接绑定到TreeView并显示我的数据层次结构吗?我知道我必须使用几个HierarchicalDataTemplates,但我不知道如何告诉每个人要显示什么数据。

如果我有一个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"/>

需要设置哪些属性才能直接从DataSet显示我的数据?

编辑:理想情况下,我想使用单个自引用DataTable来完成此操作。

3 个答案:

答案 0 :(得分:1)

这个网站有一些很好的使用treeview的例子。

BeaStollnitz

答案 1 :(得分:1)

我认为你不能那样做。

Treeview控件和HierarchicalDataTemplate期望对象的层次结构。 DataSet本质上是平的。

您必须以某种方式将该数据集转换为对象层次结构,每个对象都有自己的“Children”集合。树视图的ItemsSource将绑定到“顶级集合”(没有父引用的行)。

每个HierarchicalDataTemplate都将其ItemsSource属性绑定到相应的Children属性。

可能有一个使用转换器的解决方案,但如果它存在,它可能最终会比在绑定之前直接重新整形数据更复杂。

答案 2 :(得分: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等)以显示其他数据。