我有一个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);
}
}
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?
}
我想我可以在这里使用回溯。但这是一个非常糟糕的主意。您怎么看?
您的递归方法有问题:
我可以感觉到您正在树中进行“某种”深度优先搜索。