0

i have a Class bound to a wpf treeview like this

public class Vorlageneintrag : INotifyPropertyChanged
    {
        public string erw_Ausgabe { get; set; }
        public string erw_Pfad { get; set; }
        public string erw_Mailadresse { get; set; }
        ...
        public ObservableCollection<Vorlageneintrag> Items {get; set;}
        ...
 public Vorlageneintrag Copy()
        {
            return (Vorlageneintrag)this.MemberwiseClone();
        }
    }

works fine, now i added a Filterfunction, that removes all not filter matching "Vorlageneintrag". Works as i want. But now my Problem: How can get i the original List back to reset my Filter? reseting Itemssource by using .toList() or .MemberwiseClone() from a copy works only for the first "Layer" but not for Vorlageneintrag.Items or Vorlageneintrag.Items[0].Items and deeper (there can be "unlimited" Sub-sub-sub...-trees). Or will it better to create/fill a complete new object?

Edit: Filtering:

 List<Vorlageneintrag> temp =((ObservableCollection<Vorlageneintrag>)tree_vorlagen.ItemsSource).ToList();
              
                ObservableCollection<Vorlageneintrag> orglist=((ObservableCollection<Vorlageneintrag>)tree_vorlagen.ItemsSource);

             
                    foreach (var item in temp)
                    {
                    
                  
                    if(Loopandfilter(item).Items.Count==0)
                    {
                       orglist.Remove(item);
                    }
                    else
                    {
                        item.IsNodeExpanded = true;
                    }


                    }

 private Vorlageneintrag Loopandfilter(Vorlageneintrag item)
        {
            if(item.Items.Count==0)
            {
                item.IsNodeExpanded = true;
                return item;
            }
            else
            {

                List<Vorlageneintrag> temp = item.Items.ToList();
               
                foreach (Vorlageneintrag tmp_item in temp)
                {

                 
                    
                    if (Loopandfilter(tmp_item).Items.Count == 0)
                    {
                        if (!tmp_item.erw_Ausgabe.ToLower().Contains(tb_qicksearch.Text.ToLower()))
                        {
                            item.Items.Remove(tmp_item);
                            
                        }
                        else
                        {
                            
                            item.IsNodeExpanded = true;
                        }
                    }
                }
                
            }
              
            return item;
        }
user3600403
  • 339
  • 1
  • 2
  • 18

1 Answers1

1

When you are calling MemberwiseClone() you are creating a shallow copy, meaning that the Items collection items will not be copied, but rather the reference to the collection itself will be copied, so both the original and the cloned Vorlageneintrag objects will refer to the same Items collection. To make a deep copy that will be independent of the original object you can do this:

public class Vorlageneintrag : INotifyPropertyChanged
{
    public string erw_Ausgabe { get; set; }
    public string erw_Pfad { get; set; }
    public string erw_Mailadresse { get; set; }
    
    public ObservableCollection<Vorlageneintrag> Items { get; set; }
    
    public Vorlageneintrag Copy()
    {
        var shallowClone = (Vorlageneintrag)MemberwiseClone();
        if (shallowClone.Items == null)
            return shallowClone;

        var cloneItems = new ObservableCollection<Vorlageneintrag>();
        foreach (var item in Items)
            cloneItems.Add(item.Copy());

        shallowClone.Items = cloneItems;
        return shallowClone;
    }

    public event PropertyChangedEventHandler PropertyChanged;
}

Also since you are likely have a binding to Items you probably should invoke PropertyChanged event in the Items setter, although that depends on the rest of your code.

Dharman
  • 30,962
  • 25
  • 85
  • 135