假设我有一个二叉树,其中数据结构的根只是一个树节点。对于每个节点,可以通过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>
答案 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>