我可以将WPF TreeView绑定到单个根节点吗?

时间:2010-01-30 20:51:27

标签: .net wpf xaml treeview hierarchy

假设我有一个二叉树,其中数据结构的根只是一个树节点。对于每个节点,可以通过Children属性访问子节点。这是我尝试过的。 TreeRoot是继承数据上下文的属性,但它是单个节点(不是集合)。

<UserControl.Resources>
    <HierarchicalDataTemplate x:Key="TreeNodeTemplate" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
</UserControl.Resources>

<Grid>
    <TreeView ItemsSource="{Binding TreeRoot}" ItemTemplate="{StaticResource TreeNodeTemplate}" />
</Grid>

3 个答案:

答案 0 :(得分:9)

我遇到了这个问题并得出结论,我无法将非集合绑定到树视图作为指定根节点的方法。所以我做的是快速更改我的ModelView,并使表示根节点的属性成为1项的集合。

public class ContainerViewModel
{
   public ObservableCollection<TreeNodeViewModel> RootNodes { get; private set; }

   public ContainerViewModel()
   {
      // Create a single node in the collection of root nodes
      RootNodes = new ObservableCollection<TreeNodeViewModel>();
      RootNodes.Add(new TreeNodeViewModel());
   }
}

public class TreeNodeViewModel
{
   public ObservableCollection<TreeNodeViewModel> Children { get; set; }
}

我使用了ObservableCollection&lt;&gt;以上但可能更有意义的是使用更便宜的东西,如List&lt;&gt;因为您不希望收集更改(至少在您的方案中)。

答案 1 :(得分:4)

我认为您的问题是您的分层数据模板仅应用于根节点,因此您永远不会看到根目录的子节点之外的任何内容。试试这个:

<UserControl.Resources>
    <HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}">
        <TextBlock Text="{Binding Name}" />
    </HierarchicalDataTemplate>
</UserControl.Resources>

<Grid>
    <TreeView ItemsSource="{Binding TreeRoot}"/>
</Grid>

其中TreeNode是树节点类的名称。

答案 2 :(得分:3)

像Aviad所说,如果你使用DataType="{x:Type TreeNode}",那么TreeView会自动将该模板用于该类型的任何对象。

如果层次结构中有多个类型,则可以指定多个HierarchicalDataTemplates,每个HierarchicalDataTemplates都包含其所用的数据类型。这会让TreeView以不同的方式处理每种类型。

<HierarchicalDataTemplate DataType="{x:Type TreeNode}" ItemsSource="{Binding Children}">
    <TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>

<HierarchicalDataTemplate DataType="{x:Type TreeLeaf}">
    <TextBlock Text="{Binding Message}" Background="Red" />
</HierarchicalDataTemplate>