c# - TreeView中的分层数据。在树中查找节点

标签 c# wpf mvvm tree treeview

我有一个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);
    }
}

View 模型
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?
}

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

最佳答案

您的递归方法有问题:

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

returns使得循环仅执行一次。

这是我的代码:
public static bool IsTreeContains(Node node, string itemName)
{
    if (node.Name == itemName)
        return true;

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

    return false;
}

第一个退出条件,然后,如果找到该项目,则停止迭代,如果没有,则继续迭代。 最后如果节点和每个n-child与所搜索的项目不同,则返回false

希望对您有所帮助。

关于c# - TreeView中的分层数据。在树中查找节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59829171/

相关文章:

c# - 我如何强制在 C# 中的结构上使用工厂

c# - WPF 中的文本框文本更改事件

wpf - 创建动画的非重复方式

c# - 从模型动态生成 ViewModel

MVVM 用户控件 - 我在哪里声明它以从页面获取数据?

c# - 组合框样式显示评级和描述 WPF

c# - 如何使用 DateTime.Now.Year 作为可选参数的默认值

c# - 如何将 "paragraph breaks"添加到我的 html 电子邮件中?

c# - 仅在 EF Core 中为 'true' 创建唯一约束

wpf - 自定义 WPF 命名空间映射在 Visual Studio 2010 中失败