2016-12-03 2 views
2

я первый попытался это:Как обновить коллекцию Observable, связанную с DataGrid WPF?

var users = await _service.Read(); 
var usersTemp = users as IList<UserDto> ?? users.ToList(); 
usersTemp.ToList().ForEach(u => 
{ 
    if (usersTemp.Contains(u)) 
    { 
     var good = Users.Remove(u); 
    } 
    Users.Add(u); 
}); 

У меня есть только один пользователь, чтобы проверить, но каждый раз, когда я выполняю приведенный выше код, который пользователь будет добавлен в коллекцию. Я добавил good и нашел Remove не работал.

Теперь вниз, чтобы повторно создать коллекцию, когда я на самом деле только хочу, чтобы обновить его:

Users = new ObservableCollection<UserDto>(await _service.Read()); 
OnPropertyChanged(nameof(Users)); 

Как я могу сделать это лучше? Я хочу, чтобы добавить новых пользователей в коллекцию, когда я получаю уведомление SignalR, а не делать еще один относительно дорогой Get и воссоздать коллекцию.

+1

remove не работает, потому что объекты, входящие в сервис, отличаются от того, что уже есть в коллекции. метод contains возвращает true ?. – Nkosi

ответ

1

Удалить работы с фактическим объектом в коллекции. Содержит в OP пытается сравнить объект, который изначально не был в списке. Попробуйте найти нужный объект с помощью некоторого идентификатора, а затем замените объект, если он найден. иначе добавьте его в список.

usersTemp.ToList().ForEach(u => { 
    var user = Users.FirstOrDefault(x => x.ID == u.ID); 
    if (user != null) {//User already exists 
     var index = Users.IndexOf(user);//get its location in list 
     Users[index] = u;//replace it with new object 
    } else { 
     Users.Add(u); 
    } 
}); 
+0

Спасибо. И дополнительные баллы за предложение «Заменить». – ProfK