【问题标题】:Get item of recursive observablecollection获取递归 observablecollection 的项
【发布时间】:2014-04-17 07:49:21
【问题描述】:

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

如果我将树绑定到树视图,一切都可以正常工作,但是当我想从树中获取元素时,我遇到了问题。例如,我试图从 Tree 中获取一个特殊主题,但它不起作用。我用下面的代码试了一下:

    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】:

    这是你想要做的吗?

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

    【讨论】:

    • 嗨,非常感谢您的帮助,一切正常。最好的问候,祝你有美好的一天
    • @user2644964 很高兴听到。如果这是您需要的解决方案,请随时将其标记为答案(左侧的复选标记)。我喜欢这些观点:)
    猜你喜欢
    • 2012-03-07
    • 2021-11-01
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多