C# WPF:从文本文件创建 TreeView

C# WPF: Create TreeView from text file

我使用 class 创建我的 TreeViewItems。在示例中,节点在源代码中指定。但是,如果要从内容如下的文本文件导入节点,我该怎么做:

text file content

有什么想法吗?

我尝试了以下方法。

    public MainWindowVM()
    {
        private ObservableCollection<Node> mRootNodes;
        public IEnumerable<Node> RootNodes { get { return mRootNodes; } }
        List<string[]> TreeNodes = new List<string[]>();

        string[] lines = null;
        try
        {
            lines = System.IO.File.ReadAllLines(MainWindow.TextFilePath , System.Text.Encoding.Default);
        }
        catch (IOException ex)
        {
            MessageBox.Show(ex.Message);
            Environment.Exit(0);
        }
        if (lines == null || lines.Length == 0)
        {
            MessageBox.Show("Text file has no content!");
            Environment.Exit(0);
        }

        foreach (var line in lines)
        {
            TreeNodes.Add(line.Split('|'));
        }

        Node newNode = null;
        Node childNode = null;
        Node root = new Node() { Name = TreeNodes[0][0] };
        if (TreeNodes[0].Length > 1)
        {
            newNode = new Node() { Name = TreeNodes[0][1] };
            root.Children.Add(newNode);
        }
        for (int s = 2; s < TreeNodes[0].Length; s++)
        {
            childNode = new Node() { Name = TreeNodes[0][s] };
            newNode.Children.Add(childNode);
            newNode = childNode;
        }
    }

但我只得到前两个节点。我不知道如何用循环构建整个 TreeView。

TreeView

输入示例

Root|A
Root|B|C
Root|B|D
Root|E

您的代码存在的问题是您只处理了 TreeNodes[0] 元素。要处理一组元素,您需要一个循环

 public MainWindowVM()
{
    private ObservableCollection<Node> mRootNodes;
    public IEnumerable<Node> RootNodes { get { return mRootNodes; } }

    string[] lines = null;
    try
    {
        lines = System.IO.File.ReadAllLines(MainWindow.TextFilePath , System.Text.Encoding.Default);
    }
    catch (IOException ex)
    {
        MessageBox.Show(ex.Message);
        Environment.Exit(0);
    }
    if (lines == null || lines.Length == 0)
    {
        MessageBox.Show("Text file has no content!");
        Environment.Exit(0);
    }
    Dictionary<string, Node> nodeCache = new Dictionary<string, Node>();
    // processing each line
    foreach (var line in lines)
    {                
        Node parentNode = null;
        string key = null;
        // in each line there are one or more node names, separated by | char
        foreach (string childNodeName in line.Split('|'))
        {
            Node childNode;
            // names are not unique, we need a composite key (full node path)
            key += "|" + childNodeName;
            // each node has unique key
            // if key doesn't exists in cache, we need to create new child node
            if (false == nodeCache.TryGetValue(key, out childNode))
            {
                childNode = new Node { Name = childNodeName };
                nodeCache.Add(key, childNode);

                if (parentNode != null)
                    // each node (exept root) has a parent
                    // we need to add a child node to parent ChildRen collection
                    parentNode.Children.Add(childNode);
                else 
                    // root nodes are stored in a separate collection
                    mRootNodes.Add(childNode);
            }

            // saving current node for next iteration
            parentNode = childNode;
        }
    }
}