2016-04-20 53 views
-3

我正在製作一個filtereditems類,它將在WPF中顯示爲樹形視圖。 filtereditems類僅包含來自包含特定條件的treeitems類的特定節點項。我能夠克隆所有樹項目並將它們添加到filtereditems列表中。從那裏我找到不符合標準的節點並適當地刪除它們。不過,我發現使用克隆使我無法刪除這些項目。有什麼我應該知道的克隆項目,爲什麼他們不能從我的收藏中刪除? (希望這可以幫助任何人在我同樣的困境):從列表中刪除克隆的節點

public class Node: INotifyPropertyChanged, ICloneable 
{ 
    public Name { get;set;} 
    public ID {get;set;} 
    public ParentNode {get;set;} 
    public ObservableCollection<Nodes> ChildNodes{get;set;} 
    public object Clone() 
     { 
      Node toReturn = new Node(); 
      toReturn.Name = this.Name; 
      toReturn.ID = this.ID; 
      toReturn.ParentNode = this.ParentNode; 
      foreach (Node child in this.ChildNodes) 
      { 
       toReturn.ChildNodes.Add((Node) child.Clone()); 
      } 
      return toReturn; 
     } 
} 

public void filterStart(ChildNodesListViewDataSource _filterStart) 
     { 
      if (this.FilterString != null && this.Entity != null) 
      { 
       this.TotalItemsNumber = 0; 
       this.FilterItemsNumber = 0; 

        this.FilterTreeItems.Clear(); 
        foreach (Node y in TreeItems) 
        { 

         this.FilterTreeItems.Add((Node)y.Clone()); 
         foreach (Node x in FilterTreeItems) 
         { 
          FilterRoot(x); 
         } 
        } 

       TakeOutTrash(); 

public bool FilterRoot(Node FilterItems) 
     { 
      bool HasMatchingChildren = false; 
      if (FilterItems.ChildNodes != null ||  FilterItems.ChildNodes.Count !=0) 
      { 
       foreach (Node FilterItemsComponenents in FilterItems.ChildNodes) 
       { 
        if (FilterRoot(FilterItemsComponenents)) 
        { 
         HasMatchingChildren = true; 
        } 
       } 
      } 
      string NameOfFilterItem = FilterItems.Name.ToUpper(); 
      string FilterStringUpperCase = FilterString.ToUpper(); 
      bool FilterStringCheck = NameOfFilterItem.Contains(FilterStringUpperCase); 
      if (!FilterStringCheck && !HasMatchingChildren) 
      { 
       trimIDs.TrashCan.Add(FilterItems); 
       return false; 
      } 
      else 
      { 
       return true; 
      } 
     } 

public void TakeOutTrash() 
     { 
      foreach (Node node in trimIDs.TrashCan) 
      { 
       this.FilterTreeItems.Remove(node); 
      } 
     } 

     public class TrimIDs 
     { 
      public IList<ComponentNodeViewModel> TrashCan { get; set;} 
      { 
       TrashCan = new List<ComponentNodeViewModel>(); 
      } 
     } 
+0

你爲什麼要克隆呢? – FINDarkside

+0

把你的代碼請澄清你的問題 –

+0

我克隆他們,因爲TreeItems和FilterTreeItems類都是指針,並且由於創建這些類的方式刪除節點是過濾樹最簡單的方法。然而,除了TakeOutTrash方法之外,所有的邏輯都適用於過濾,我無法實際刪除(節點)。即使我的代碼達到了這種方法。 –

回答

0

我居然通過創建克隆的任何節點不在節點列表中沒有克隆另一個克隆的方法,解決了我的問題。

public object Clone(IList<Node> ListNotToClone) 
    { 
     NodetoReturnFiltered = new Node(); 
     toReturnFiltered.Name = this.Name; 
     toReturnFiltered.ID = this.ID; 
     toReturnFiltered.ParentNode= this.ParentNode; 
     foreach (Node child in this.ComponentNodes) 
     { 
      if (!ListNotToClone.Contains(child)) 
      { 
       toReturnFiltered.ComponentNodes.Add((Node)child.Clone(ListNotToClone)); 
      } 
     } 
     return toReturnFiltered; 
    } 

然後我用這個方法:

public void TakeOutTrash() 
    { 
     foreach (ComponentNodeViewModel root in this.FilterTreeItems) 
     { 
      FilterHolder = (ComponentNodeViewModel)root.Clone(trimIDs.TrashCan); 
     } 
    } 

並通過FilterHolder回在FilterStart方法FilterTreeItems,

this.FilterTreeItems.Clear(); 
this.FilterTreeItems.Add(FilterHolder);