TreeView中的分层数据。在树中找到一个节点

问题描述 投票:0回答:2

我有一个TreeView,其中显示层次数据。

型号

class Node : INotifyPropertyChanged
{
    public string Name { get; set; }
    public ObservableCollection<Node> Nodes { get; set; } = new ObservableCollection<Node>();
}

节点的存储:

class NodesStorage : ObservableCollection<Node>
{
    public NodesStorage()
    {
        var node = new Node { Name = "1" };
        node.Nodes.Add(new Node { Name = "1a" });
        node.Nodes.Add(new Node { Name = "1b" });
        node.Nodes.Add(new Node { Name = "1c" });

        var node1 = new Node { Name = "2" };
        node1.Nodes.Add(new Node { Name = "2a" });
        node1.Nodes.Add(new Node { Name = "2b" });
        node1.Nodes.Add(new Node { Name = "2c" });

        this.Add(node);
        this.Add(node1);
    }
}

ViewModel

class MainWindowViewModel
{
    public MainWindowViewModel()
    {
        Nodes = new NodesStorage();
    }

    public ObservableCollection<Node> Nodes;
}

查看

<!--... Set DataContext ...-->

<TreeView ItemsSource="{Binding Path=Nodes}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Path=Nodes}">
            <TextBlock Text="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

<!--...-->

问题

现在,如果树包含具有以下名称的节点和在另一种情况下为true的节点,我想制作返回false的方法:

public static bool IsTreeContains(Node node, string itemName)
{
    if (node.Name == itemName)
        return true;

    foreach (var n in node.Nodes)
    {
        return IsTreeContains(n, itemName);
    }

    // And what should I write here?
}

我想我可以在这里使用回溯。但这是一个非常糟糕的主意。您怎么看?

c# wpf mvvm tree treeview
2个回答
1
投票

您的递归方法有问题:


1
投票

我可以感觉到您正在树中进行“某种”深度优先搜索。

© www.soinside.com 2019 - 2024. All rights reserved.