C# 像这样的物体有名字吗?我该如何用它来填充树视图呢?
我使用的对象结构如下:C# 像这样的物体有名字吗?我该如何用它来填充树视图呢?,c#,wpf,list,data-structures,tree,C#,Wpf,List,Data Structures,Tree,我使用的对象结构如下: class Node { string name; List<Node> children = new List<Node>{}; Node parent; } 类节点 { 字符串名; 列表子项=新列表{}; 节点父节点; } 我可以在与当前节点相同的级别添加子节点或节点 像这样的物体有没有术语 我如何用这个填充wpf树视图,使其看起来像这样: parent0 child0 child1 chi
class Node
{
string name;
List<Node> children = new List<Node>{};
Node parent;
}
类节点
{
字符串名;
列表子项=新列表{};
节点父节点;
}
我可以在与当前节点相同的级别添加子节点或节点
像这样的物体有没有术语
我如何用这个填充wpf树视图,使其看起来像这样:
parent0
child0
child1
child0ofchild1
.
.
.
父母0
儿童0
孩子1
子女
.
.
.
我希望它能够无限长,所以固定for循环不是一个选项。
foreach工作得很好,但当我在这棵树上下两层以上的时候遇到了问题。
c#中已经有更简单的东西了吗?还是我走对了方向
抱歉,如果这是一个重复的问题,但我不知道谷歌的正确术语…要遍历树,递归函数是通用的解决方案。如果绑定到WPF树,我将使用ObservableCollection代替子项的List。我做了一个简单的例子,用递归函数建立一棵树,然后在WPF树视图中显示它。 这是数据类:
public class TreeNode {
public ObservableCollection<TreeNode> Children {
get;
} = new ObservableCollection<TreeNode>();
public string Name {
get;set;
}
}
当然,这只是一个简单的例子,我会使用视图模型和数据绑定等,但这超出了这个问题的范围。兄弟节点数上界为
n
的树称为n元树
。你所描述的对兄弟节点的数量没有上限,所以它被称为“树”。你所说的“无限”是指非常、非常、深还是长?真正的“无限”当然很难做到。另一件事是:如果你设法让TreeView显示这棵非常大的树,操作起来会非常缓慢和麻烦。这真的是你想要的吗?你应该使用绑定。使这些属性成为公共属性,而不是私有变量。将treeview的itemssource绑定到作为节点列表的公共属性。为类指定一个比节点更好的名称。在树视图中定义HierarchycalDataTemplate。在这种情况下,将itemssource绑定到子级@Szeperator不能真正推荐一些东西,因为缺乏关于用例的知识。TreeView当然非常适合显示树:),但它也有局限性。你提到了“无限”的大树。这引起了一些争议,仅此而已。“文件”听起来对TreeView来说是合理的。看看安迪的链接(见上面的评论)。这不像其他GUI元素那么简单,但绝对可行。请记住,您可能还希望有一个类似“搜索”的字段或其他内容,以避免长达一分钟的鼠标滚轮折磨。也许是“崩溃所有”。。。
/// <summary>
/// Fill a recursive tree
/// </summary>
/// <param name="node">The treenode to generate children for</param>
/// <param name="depth">Current depth, always incremented by 1 when going deeper in recursion</param>
/// <param name="namePostfix">Name postfix, just for generating display name for the nodes</param>
void fillTree(TreeNode node, int depth, string namePostfix) {
// exit to prevent endless recursion
if (depth >= 5) {
return;
}
for (int i = 0; i < 6; ++i) {
var child = new TreeNode() {
Name = $"Node{namePostfix}{i}"
};
fillTree(child, depth + 1, namePostfix + i);
node.Children.Add(child);
}
}
<TreeView x:Name="tv">
<TreeView.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:TreeNode}" ItemsSource="{Binding Children}">
<TextBlock Text="{Binding Name}" />
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
fillTree(tree, 0, "");
tv.Items.Add(tree); // tv is the x:Name of the TreeView