Как работает ObservableCollection/INotifyPropertyChange при изменении объектаC#

Место общения программистов C#
Anonymous
Как работает ObservableCollection/INotifyPropertyChange при изменении объекта

Сообщение Anonymous »

У меня есть ситуация, когда в одной модели представления обновляются некоторые свойства объекта. В другой модели представления я подписываюсь на сообщение, а затем обновляю коллекцию этим новым объектом, например:

Код: Выделить всё

WeakReferenceMessenger.Default.Register(this, (r, m) =>
{
if (this.MyObjects != null)
{
var myObj = this.MyObjects.FirstOrDefault(x => x.MyObject == m.Value.MyObject);

if (myObj != null)
{
myObj = m.Value;
//myObj.MyProperty = m.Value.MyProperty; //this updates UI, above line does not
}
}
});
Несмотря на то, что MyObject реализует INotifyPropertyChanged, а MyObjects представляет собой ObservableCollection, пользовательский интерфейс WPF не обновляется.
Однако, если я обновлю свойство myObj следующим образом:

Код: Выделить всё

myObj.MyProperty = m.Value.MyProperty;
Пользовательский интерфейс WPF обновляется.
Я предполагаю, что это связано с тем, что изменение объекта не запускает PropertyChanged событие (поскольку это не добавление/обновление/переупорядочение коллекции), в отличие от изменения свойства объекта.
Итак, два вопроса:
  • Правильно ли я понимаю, почему это не работает?
  • Как лучше всего справиться с ситуацией, когда какие-либо/все свойства могли измениться? Я хочу избежать необходимости вручную записывать обновления для каждого свойства объекта (которые затем сломаются, если будет добавлено новое свойство, и я забуду обновить это сообщение).


Подробнее здесь: https://stackoverflow.com/questions/787 ... is-changed

Вернуться в «C#»