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