Могу ли я обновить значения в ObservableCollection <T>, не уничтожая и не добавляя новые элементы? - PullRequest
0 голосов
/ 24 ноября 2010

У меня проблема с моим приложением WPF - я использую ObservableCollection<T> для привязки пользовательского интерфейса к коллекции игроков. Этот список обновляется каждые 10 секунд с новыми данными, передаваемыми с игрового сервера. Проблема в том, что удаление списка и повторное добавление всего приводит к некоторым ужасным несоответствиям пользовательского интерфейса:

  • выбранные позиции отменяются
  • Открытые контекстные меню становятся несвязанными и бесполезными
  • возможно, возникли некоторые ошибки из всех потерянных экземпляров предмета

Поэтому я спрашиваю, могу ли я обновить значения для элемента, которые не соответствуют предыдущему значению. Мне все еще нужно, чтобы он был дружественным к привязке данных для пользовательского интерфейса (автоматическое обновление на PropertyChanged).

Ответы [ 2 ]

3 голосов
/ 24 ноября 2010

Если вы можете найти игроков в коллекции, вы можете просто отобразить им обновленные значения свойств. Если проигрыватель сам реализует INotifyPropertyChanged, он должен работать без особых усилий.

1 голос
/ 24 ноября 2010

Одним из вариантов является извлечение данных Player в его собственный класс и инкапсуляция данных в оболочку. Например:

public sealed class PlayerData
{
    //Data related to the Player (possibly immutable)
}

public sealed class Player : INotifyPropertyChanged
{
    private PlayerData _data;

    //Mirror properties for information in data

    //Other functionality

    public void ChangeData(PlayerData newData)
    {
        _data = newData;
        //Trigger OnPropertyChanged(null) here to invalidate public state
    }
}

Теперь вы можете заменить данные для проигрывателя без необходимости аннулировать внешний экземпляр проигрывателя. Если вы посмотрите внимательно, это на самом деле своего рода ViewModel для базовой модели Player.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...