2010-01-30 45 views
15

说我有一棵二叉树,其中数据结构的根只是一个树节点。对于每个节点,都可以通过Children属性访问子节点。这是我的尝试。 TreeRoot是继承的数据上下文的属性,但它是单个节点(不是集合)。我可以将WPF TreeView绑定到单个根节点吗?

<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> 
+0

下面的答案是否可以解决您的问题,山姆?如果是这样,你能接受最好解决你的问题的答案吗?如果没有,你能否提供更多关于缺少的信息?谢谢! – 2016-01-19 13:27:13

回答

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

就像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> 
9

我有这个问题,并得出结论,我无法将非集合绑定到树视图作为指定根节点的方式。所以我所做的就是做出迅速改变我的模型视图,并表示根节点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 <>但可能会更有意义,使用更便宜的东西就像一个列表<>,因为你不希望集合改变(至少在你的情况下)。