繁体   English   中英

获取递归 observablecollection 的项

[英]Get item of recursive observablecollection

我有一个带有 observablecollection 的 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;
    }

但是通过递归它没有用。

这是你想要做的吗?

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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM