этот вопрос покажет мое отсутствие понимания ожидаемого поведения при реализации/использовании INotifyPropertyChanged:
Вопрос: для привязки к работе, как и ожидалось, когда у вас есть класс, который сам реализует INotifyPropertyChanged, который имеет вложенные свойства типа INotifyPropertyChanged, вы ожидаете, что будете внутренне подписываться на уведомление об изменении этих свойств, а затем распространять уведомления? Или есть инфраструктура привязки, которая, как ожидается, имеет умственные способности, чтобы сделать это ненужным?
Например (обратите внимание, что этот код не является полным - просто для иллюстрации вопроса):
public class Address : INotifyPropertyChanged
{
string m_street
string m_city;
public string Street
{
get { return m_street; }
set
{
m_street = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("Street"));
}
}
public string City
{
get { return m_city; }
set
{
m_city = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("City"));
}
}
public class Person : INotifyPropertyChanged
{
Address m_address;
public Address
{
get { return m_address = value; }
set
{
m_address = value;
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
}
Итак, в этом примере у нас есть вложенный объект Address в объекте Person. Оба из них реализуют INotifyPropertyChanged, так что изменение их свойств приведет к передаче уведомлений об изменении свойств подписчикам.
Но скажем, используя привязку, кто-то подписывается на уведомление об изменении объекта Person, и "прослушивает" изменения свойства "Адрес". Они получат уведомления, если само свойство "Адреса" будет изменено (другой объект адреса назначен), но НЕ будет получать уведомления, если данные, содержащиеся в вложенном адресном объекте (городе или улице), будут изменены.
Это приводит к вопросу - должна ли инфраструктура привязки обрабатываться, или я должен в рамках моей реализации Person подписываться на уведомления об изменении на адресном объекте, а затем распространять их как изменения на "Адрес"?
Если вы доберетесь до этого момента, спасибо, просто потратив время на чтение этого долгого вопроса?
Комментарий очень оценен!
Фил