ObservableCollections и изменения свойств в C#

Я работаю с наблюдаемой коллекцией класса Job, который я определил. Я привязал метод для обработки события INotifyCollectionChanged. MSDN говорит мне, что INotifyCollectionChanged является «прослушивателем динамических изменений, например, когда элементы добавляются и удаляются или обновляется весь список», но я хотел бы прослушивать изменения свойств любого из классов заданий в коллекции, есть обработчик событий для этого?? Я понимаю, что есть интерфейс INotifyPropertyChanged, но я хочу, чтобы он работал с коллекцией.

РЕДАКТИРОВАТЬ:

Честно говоря, меня это смущает, поэтому я должен дать больше справочной информации о том, что я делаю, чтобы получить ответ. У меня есть это свойство в классе "Работа":

    public Boolean IsPlanned
    {
        get
        {
            return this.Storage<Job>().isPlanned;
        }
        set
        {
            var storage = this.Storage<Job>();

            if (storage.isPlanned != value)
            {
                storage.isPlanned = value;
                this.OnPropertyChanged(() => this.isPlanned);
                MessageBox.Show("IsPlanned property was changed on one of the jobs " + this.Subject);
            }
        }
    }

Этот класс задания на самом деле наследуется от класса назначения элемента управления телериком (который, как оказалось, реализует INotifyPropertyChanged). Из документации телерика я также получил приведенный выше код (без окна сообщения). Теперь, когда я изменяю это логическое значение ONCE, эта строка окна сообщения выполняется 5 раз.

Любая помощь приветствуется!

РЕДАКТИРОВАТЬ 2: Пути были изменены IsPlanned:

PresentationManager.Instance.AllJobs.Single(o => o.JobGuid.Equals(((Job)state.DraggedAppointments.First()).JobGuid)).IsPlanned = true;

PresentationManager.Instance.AllJobs.Single(o => o.JobGuid.Equals(((Job)payload.DraggedAppointments.First()).JobGuid)).IsPlanned = false;

Они оба из разных классов, которые используются для определения переопределения моего пользовательского поведения перетаскивания (из списка).


comment
Что вы имеете в виду, говоря, что я хочу, чтобы это работало над коллекцией? Добавить, удалить элемент из коллекции?   -  person ADIMO    schedule 31.10.2011
comment
Можете ли вы указать пути кода, в которых вы изменяете свойство IsPlanned?   -  person Johannes Kommer    schedule 31.10.2011
comment
Примечание: первая строка, которую я только что добавил в этом редактировании, — это та, которая заставляет окно сообщения отображаться 5 раз, 2-я строка работает нормально (просто отображает msg один раз).   -  person    schedule 31.10.2011
comment
Глядя на код, который вы разместили, его следует вызывать только один раз. Я тоже не могу воспроизвести 5 вызовов в своем тестовом коде. Пробовали ли вы подключить отладчик, чтобы увидеть, как вызывается код, и есть ли какие-либо циклы, вызывающие проблемы?   -  person Johannes Kommer    schedule 31.10.2011
comment
Я снова начинаю это дерьмо. Код вышел из-под контроля, понятия не имею, почему он делает это 5 раз, и все больше и больше с ним что-то не так. Спасибо, в любом случае.   -  person    schedule 31.10.2011


Ответы (2)


Реализуйте интерфейс INotifyPropertyChanged в классе Job. Это должно позволить вам использовать PropertyChanged на вашем ObservableCollection<Job>.

Чтобы полностью поддерживать передачу значений данных из исходных объектов привязки в целевые объекты привязки, каждый объект в вашей коллекции, поддерживающий привязываемые свойства, должен реализовывать соответствующий механизм уведомления об изменении свойства, такой как интерфейс INotifyPropertyChanged.

person Johannes Kommer    schedule 31.10.2011
comment
Конечно, спасибо еще раз J.Kommer, сегодня очень помог, приятель. - person ; 31.10.2011
comment
Ах, подождите, ваше редактирование просто смутило меня, ха-ха, мне придется прочитать, как это сделать. На самом деле не так важно, чтобы я достиг этого в коллекции, если подумать. Мне нужно отслеживать любые изменения, внесенные в какие-либо свойства в классе заданий (все задания в любом случае будут найдены в этой коллекции), и обработчик событий вызовет метод в совершенно другом одноэлементном классе. Я все равно придумаю, как это реализовать, думаю, это может быть ссылка: msdn.microsoft.com/en-us/library/ms229614.aspx - person ; 31.10.2011
comment
Эта ссылка выше делает ее такой простой - я не совсем уверен, почему вам нужно наследовать класс INotifyPropertyChanged, но я почти уверен, что это мой ответ. - person ; 31.10.2011
comment
Извините за путаницу, он по-прежнему будет работать отдельно от вашей коллекции. Мое редактирование относилось к тому факту, что вы также можете сделать это для всей коллекции, как только интерфейс будет реализован. - person Johannes Kommer; 31.10.2011
comment
Основная причина наследования от интерфейса заключается в том, чтобы разрешить универсальный код, т. е. вы можете писать методы, которые будут работать с чем угодно, реализующим интерфейс + все, что работает с этими интерфейсами из .NET Framework, мгновенно работает и с вашим кодом. Представьте, что в будущем у вас также будет класс User, для которого вы хотите сделать такое же поведение при изменении свойства, как для Job. - person Johannes Kommer; 31.10.2011
comment
Вы правы, и я буду иметь это в виду, если мне нужно, чтобы это пошло именно так. Еще раз спасибо - person ; 31.10.2011
comment
J.Kommer - см. редактирование, пожалуйста, немного больше объяснений, я действительно застрял на последнем препятствии, если я смогу заставить эту строку кода запускаться только тогда, когда она делает именно то, что мне нужно. - person ; 31.10.2011

Вот один пример из StackOverflow реализации ObservableCollection, который также вызывает события при изменении содержащихся элементов:

ObservableCollection, который также отслеживает изменения элементов в коллекции

См. Reed Copsey на ответьте в этой теме, чтобы получить ссылку на проект, в котором реализована коллекция ObservableCollection, прослушивающая дочерние элементы.

person wageoghe    schedule 31.10.2011