3 回答
TA贡献1815条经验 获得超10个赞
A HierarchicalDataTemplate是一种表达方式,“这就是您呈现这种类型的对象的方式,这是可以探查以找到该对象下的子节点的属性”
因此,您需要一个返回该节点“子级”的属性。例如(如果您不能同时使“组”和“条目”都源自同一个节点类型)
public class Group{ ....
public IList<object> Items
{
get
{
IList<object> childNodes = new List<object>();
foreach (var group in this.SubGroups)
childNodes.Add(group);
foreach (var entry in this.Entries)
childNodes.Add(entry);
return childNodes;
}
}
接下来HierarchicalDataTemplate,由于条目没有子项,因此不需要条目。因此,需要更改XAML以使用新的Items属性和DataTemplatefor条目:
<TreeView Name="GroupView" Grid.Row="0" Grid.Column="0" ItemsSource="{Binding}">
<TreeView.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Group}" ItemsSource="{Binding Items}">
<TextBlock Text="{Binding Path=Name}" />
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type local:Entry}" >
<TextBlock Text="{Binding Path=Name}" />
</DataTemplate>
</TreeView.Resources>
</TreeView>
TA贡献1712条经验 获得超3个赞
我认为您已经完成了大部分工作...只需进行一点点返工,就可以轻松完成此工作...
我建议您创建一个基本抽象类(或您喜欢的一个接口),并为Group和Entry类继承/实现它。
这样,您可以在Group对象中公开一个属性
public ObservableCollection<ITreeViewItem> Children { get; set; }
^至此,您可以决定是否替换子组和条目的列表,或者只是将它们附加在一起并在属性getter中返回它们...
现在,您只需要使用Group或Entry对象填充Children集合,HierarchicalDataTemplate当将对象放置在TreeView中时,它将正确呈现。
最后要考虑的是,如果Entry始终是树的“底层”(即没有子级),则无需HierarchicalDataTemplate为Entry对象定义a即可DataTemplate。
希望这可以帮助 :)
TA贡献1876条经验 获得超5个赞
这是Gishu答案的替代实现,它返回IEnumerable而不是IList,并使用yield关键字来简化代码:
public class Group
{
...
public IEnumerable<object> Items
{
get
{
foreach (var group in this.SubGroups)
yield return group;
foreach (var entry in this.Entries)
yield return entry;
}
}
}
- 3 回答
- 0 关注
- 1411 浏览
添加回答
举报