Другие классы должны будут зарегистрироваться на событие PropertyChanged
Адреса, если они заинтересованы в его использовании
Например, Contact
вызовет событие PropertyChanged
только на Address
, еслиссылка на объект изменяется, например, устанавливается Address = new Address()
или Address = null
.Это не заботится о свойствах Адреса, и это правильно.Если вы хотите, чтобы он заботился о свойствах, подключите событие PropertyChange
к Address.PropertyChanged
, чтобы вызвать событие Contact.Address
PropertyChange
public class Contact : INotifyPropertyChanged
{
Address m_address;
public Address Address
{
get { return m_address = value; }
set
{
// Remove old PropertyChanged notification if it existed
if (m_address != null)
m_address.PropertyChanged -= Address_PropertyChanged;
m_address = value;
// Add new PropertyChanged notification if it existed
if (m_address != null)
m_address.PropertyChanged += Address_PropertyChanged;
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
}
}
void Address_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
if (e.PropertyName == "City")
NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
}
Вы должны сделать то же самое с Personclass, если вы хотите, чтобы событие также всплыло в классе Person.
Другой альтернативой является использование какой-либо системы обмена сообщениями, такой как MVVM Light Messenger
или Microsoft Prism EventAggregator
.В этой системе класс Address
будет транслировать событие всякий раз, когда изменяется City
, а класс Person
будет подписываться на эти сообщения и обрабатывать их с тем, что вы хотите, предоставляя Address
, который отправил сообщение, равным Person.Contact.Address