我有一个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/