Подробнее - При вложении свойств, которые реализуют INotifyPropertyChanged, должен распространяться родительский объект? - PullRequest
3 голосов
/ 23 декабря 2011

Мой вопрос похож на следующий существующий вопрос: При вложении свойств, которые реализуют INotifyPropertyChanged, должен распространяться распространитель родительского объекта?

Мой вопрос: есть ли у меня три уровня следующим Человек контакт Адрес

    public class Address : INotifyPropertyChanged
    {
        string m_city;
        public string City
        {
            get { return m_city; }
            set
            {
                m_city = value;
                NotifyPropertyChanged(new PropertyChangedEventArgs("City"));
            }
        }
    }

    public class Contact : INotifyPropertyChanged
    {
        Address m_address;

        public Address Address
        {
            get { return m_address = value; }
            set
            {
                m_address = value;
                NotifyPropertyChanged(new PropertyChangedEventArgs("Address"));
            }
        }
    }

    public class Person : INotifyPropertyChanged
    {
        Contact m_contact;

        public Contact ContactInfo
        {
            get { return m_contact = value; }
            set
            {
                m_contact = value;
                NotifyPropertyChanged(new PropertyChangedEventArgs("ContactInfo"));
            }
        }
    }

У меня есть пользовательский элемент управления, содержащий контактный элемент управления пользователя. Когда я меняю город, он вызывает notifyPropertychanged свойства city в классе адресов. и это не вызывает ни установщик адресов в классе контактов, ни установщик контактов в классе Person. Как я могу уведомить класс человека, когда городская собственность изменилась ???

1 Ответ

0 голосов
/ 23 декабря 2011

Другие классы должны будут зарегистрироваться на событие 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

...