2014-03-12 45 views
0

我有一个TreeITem类和一个observablecollection。获取recusive observablecollection的项目

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

但随着递归它没有奏效。有没有人有一个想法如何做到这一点?

致以问候

回答

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第2个方法来处理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; 
} 
+0

海兰,非常感谢你的帮助,一切运行良好。 问候并祝你有美好的一天 – user2644964

+0

@ user2644964很好听。如果这是您需要的解决方案,请随时将其标记为答案(左侧的复选标记)。我喜欢这些观点:) – payo