获取递归observablecollection的项目

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

我有一个带有可观察集合的TreeITem类。

/// <summary>
/// Item class to generate a tree view of the queues and topics from the service bus.
/// </summary>
public class TreeItem
{
    /// <summary>
    /// The whole namespace tree
    /// </summary>
    public static ObservableCollection<TreeItem> Tree { get; set; }

    //TreeItem properties
    public string Name { get; set; }
    public ObservableCollection<TreeItem> Items { get; set; }
    .........

如果创建树结构,请执行以下操作:

            //Get queues and topics
            TreeItem namespaceTree = new TreeItem() { Name = namespaceManager.Address.ToString() };
            TreeItem queuesTree = GetQueues(namespaceManager.GetQueues());

            //Get queues and topics
            TreeItem namespaceTree = new TreeItem() { Name = namespaceManager.Address.ToString() };
            TreeItem queuesTree = GetQueues(namespaceManager.GetQueues());
            TreeItem topicsTree = GetTopics(namespaceManager.GetTopics());         

            //Generate the topic structure.
            namespaceTree.Items.Add(queuesTree);
            namespaceTree.Items.Add(topicsTree);
            Tree.Add(namespaceTree);

如果我将树绑定到树视图,那么一切都很好,但是当我想从树中获取元素时,我会遇到问题。例如,我试图从树中获取一个特殊的主题,但它没有用。我用以下代码尝试过:

    private TreeItem GetTopicFromTree(ObservableCollection<TreeItem> tree)
    {
        TreeItem treeItem = null;
        foreach(var item in tree)
        {
            if (!item.Name.Equals("topicx"))
                GetTopicFromTree(item.Items);

            else
                treeItem = item;
        }

        return treeItem;
    }

但是使用递归后,它没有用。

c# .net wpf recursion observablecollection
1个回答
0
投票

这是您要做什么吗?

private TreeItem GetTopicFromTree(ObservableCollection<TreeItem> tree)
{
    foreach(var item in tree.Items)
    {
        var found = GetTopicFromTree(item);

        if (found != null)
            return found;
    }

    return null;
}

但是TreeItem不是ObservableCollection,因此您需要GetTopicFromTree的第二种方法来处理TreeItem

private TreeItem GetTopicFromTree(TreeItem tree)
{
    if (Name.Equals("topicx"))
        return this;

    foreach(var item in tree.Items)
    {
        var found = GetTopicFromTree(item);

        if (found != null)
            return found;
    }

    return null;
}

或者也许是触摸清洁器

private TreeItem FindTopic(TreeItem node, string name)
{
    if (node.Name == name)
        return node;

    foreach (var child in node.Items)
    {
        var found = FindTopic(child, name);
        if (found != null)
            return found;
    }

    return null;
}
© www.soinside.com 2019 - 2024. All rights reserved.