Проверка, чтобы убедиться, что мои предположения верны.Обновление свойств объекта ObservableCollection с использованием INotifyPropertyChanged
У меня есть класс ObservableCollection. Я звоню в веб-службу и получаю массив устройств. Затем я перечисляю ObservableCollection и устанавливаю каждый элемент на соответствующее устройство, полученное из веб-службы. Устройства, которые я получил, имеют разные значения свойств, чем элементы в ObservableCollection, но события PropertyChanged не срабатывают.
Я предполагаю, что это ByDesign, и что для того, чтобы иметь огонь события PropertyChanged, я действительно должен перечислить каждое свойство и установить значение?
Например, в случае, указанном ниже, события PropertyChanged не срабатывают ни в одном из свойств класса Device.
ObservableCollection<Device> Items = new ObservableCollection<Device>();
Items = LoadItems();
List<Device> devices = GetDevices();
foreach (var item in Items)
{
var currentDevice = devices.Single(d1 => d1.ID == item.ID);
item = currentDevice;
}
Однако, если я вручную обновлять каждое свойство, я в бизнесе:
ObservableCollection<Device> Items = new ObservableCollection<Device>();
Items = LoadItems();
List<Device> devices = GetDevices();
foreach (var item in Items)
{
var currentDevice = devices.Single(d1 => d1.ID == item.ID);
item.Latitude = currentDevice.Latitude;
item.Longitude= currentDevice.Longitude;
}
В случае, описанном выше, и широту и долготу огонь их события.
Поскольку у моего класса есть куча свойств, есть ли лучший способ сделать это, чем один за другим?
Эй, это сработало очень хорошо. Один из типов, которые у меня есть в Device, - это свойство Location, которое является классом. Поэтому мне пришлось вызвать item.Load (currentDevice) и item.Location.Load (currentDevice.Location) –
. Мой метод также должен был загружать 'Location', но в моем коде был недостаток. См. Раздел Edit2 и новый код для обновления. Конечно, я должен отметить, что если вы теперь вызываете только 'item.Load (item.GetType(), currentDevice, true)', это означает, что событие 'PropertyChanged' для свойства' Location' не будет запущено, но в зависимости от вашего кода это может быть не так много, поскольку все свойства «Местоположение» (надеюсь) будут обновлены. Возможно, вы можете изменить код, чтобы сначала назначить новый объект Location, а затем загрузить свойства, если это проблема. –
Я задал вопрос о том, как избавиться от ссылки типа, см. Edit3 в ответе. –