Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing CollectionChanged

I have added CollectionChanged eventhandler(onCollectionChanged) to one of the ObservableCollection property.

I have found out that onCollectionChanged method gets invoked only in case of add items or remove items to the collection, but not in the case of collection item gets edited.

I would like to know how to send the list/collection of newly added, removed and edited items in a single collection.

Thanks.

like image 764
ns12345 Avatar asked Jan 03 '11 21:01

ns12345


1 Answers

You have to add a PropertyChanged listener to each item (which must implement INotifyPropertyChanged) to get notification about editing objects in a observable list.

public ObservableCollection<Item> Names { get; set; } public List<Item> ModifiedItems { get; set; }  public ViewModel() {    this.ModifiedItems = new List<Item>();     this.Names = new ObservableCollection<Item>();    this.Names.CollectionChanged += this.OnCollectionChanged; }  void OnCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) {     if (e.NewItems != null)     {         foreach(Item newItem in e.NewItems)         {             ModifiedItems.Add(newItem);              //Add listener for each item on PropertyChanged event             newItem.PropertyChanged += this.OnItemPropertyChanged;                  }     }      if (e.OldItems != null)     {         foreach(Item oldItem in e.OldItems)         {             ModifiedItems.Add(oldItem);              oldItem.PropertyChanged -= this.OnItemPropertyChanged;         }     } }  void OnItemPropertyChanged(object sender, PropertyChangedEventArgs e) {     Item item = sender as Item;     if(item != null)        ModifiedItems.Add(item); } 

Maybe you have to check if some item is already in the ModifedItems-List (with List's method Contains(object obj)) and only add a new item if the result of that method is false.

The class Item must implement INotifyPropertyChanged. See this example to know how. As Robert Rossney said you can also make that with IEditableObject - if you have that requirement.

like image 147
Arxisos Avatar answered Oct 05 '22 06:10

Arxisos