private void SettingsChangedMethod(object sender, NotifyCollectionChangedEventArgs e) { //different kind of changes that may have occurred in collection if (e.Action == NotifyCollectionChangedAction.Add) { foreach (Setting item in e.NewItems) { item.PropertyChanged += Setting_PropertyChanged; if (item.Scope == Setting.Scopes.DistributionSource.ToString() && item.Key != null) { DistributionSourceMap[item.Key] = item.Value; NotifyPropertyChanged("DistributionSourceMap"); } if (item.Scope == Setting.Scopes.DistributionTarget.ToString() && item.Key != null) { DistributionList.Add(new DistributionItem() { Folder = item.Key }); DistributionTargetMap[item.Key] = item.Value; NotifyPropertyChanged("DistributionTargetMap"); } if (item.Scope == Setting.Scopes.DistributionExe.ToString() && item.Key != null) { if (!Executables.Contains(item.Value)) { Executables.Add(item.Value); } var distribution = DistributionList.FirstOrDefault(x => x.Folder == item.Key); if (distribution != null) { distribution.Executable = item.Value; } } } } if (e.Action == NotifyCollectionChangedAction.Replace) { foreach (Setting item in e.OldItems) { item.PropertyChanged -= Setting_PropertyChanged; } foreach (Setting item in e.NewItems) { item.PropertyChanged += Setting_PropertyChanged; } } if (e.Action == NotifyCollectionChangedAction.Remove) { foreach (Setting item in e.OldItems) { item.PropertyChanged -= Setting_PropertyChanged; if (item.Scope == Setting.Scopes.DistributionSource.ToString() && item.Key != null) { DistributionSourceMap.Remove(item.Key); } if (item.Scope == Setting.Scopes.DistributionTarget.ToString() && item.Key != null) { DistributionTargetMap.Remove(item.Key); } if (item.Scope == Setting.Scopes.DistributionExe.ToString() && item.Key != null) { var setting = SettingsList.First(x => (x.Scope == item.Scope && x.Value == item.Value)); if (setting == null && Executables.Contains(item.Value)) { Executables.Remove(item.Value); } var distribution = DistributionList.First(x => x.Folder == item.Key); if (distribution != null) { distribution.Executable = ""; } } } } if (e.Action == NotifyCollectionChangedAction.Move) { //your code } }