private void Users_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (e.Action == NotifyCollectionChangedAction.Remove) { foreach (TrackedUser item in e.OldItems) { var instance = vm.Users.FirstOrDefault(vm => vm.UserId == item.UserId); if (instance != null) { vm.Users.Remove(instance); } } } else if (e.Action == NotifyCollectionChangedAction.Add) { foreach (TrackedUser item in e.NewItems) { var instance = vm.Users.FirstOrDefault(vm => vm.UserId == item.UserId); if (instance != null) { return; } var newInstance = new TrackedUserViewModel(); ViewModelMapper.TrackedUser(item, newInstance); vm.Users.Add(newInstance); } } if (e.Action == NotifyCollectionChangedAction.Replace) { foreach (TrackedUser item in e.NewItems) { var instance = vm.Users.FirstOrDefault(vm => vm.UserId == item.UserId); if (instance == null) { instance = new TrackedUserViewModel(); vm.Users.Add(instance); } ViewModelMapper.TrackedUser(item, instance); } } if (e.Action == NotifyCollectionChangedAction.Move) { foreach (TrackedUser item in e.NewItems) { var instance = vm.Users.FirstOrDefault(vm => vm.UserId == item.UserId); if (instance == null) { instance = new TrackedUserViewModel(); vm.Users.Add(instance); } ViewModelMapper.TrackedUser(item, instance); //force sort _ = vm.Users; } } vm.LastUpdate = DateTime.Now; }