ItemsControl
прослушивает CollectionChanged
для управления отображением коллекции предметов, которые она представляет на экране. A ContentControl
прослушивает PropertyChanged
для управления отображением определенного элемента, который он представляет на экране. Очень просто удержать эти две концепции в своем уме, как только вы это поймете.
Отслеживание того, отредактирован элемент или нет, не является чем-то одним из этих интерфейсов. Изменения свойств не редактируются, т. Е. Они не обязательно представляют собой какое-то инициированное пользователем изменение состояния объекта. Например, объект может иметь свойство ElapsedTime
, которое постоянно обновляется таймером; пользовательский интерфейс должен быть уведомлен об этих событиях изменения свойств, но они, конечно же, не представляют изменения в базовых данных объекта.
Стандартный способ отслеживания, был ли отредактирован объект, состоит в том, чтобы сначала реализовать этот объект IEditableObject
. Затем вы можете внутренне перейти к классу объекта, решить, какие изменения составляют редактирование (т. Е. Потребовать от вас позвонить BeginEdit
), а какие нет. Затем вы можете реализовать свойство boolean IsDirty
, которое устанавливается, когда вызывается BeginEdit
, когда вызывается EndEdit
или CancelEdit
. (Я действительно не понимаю, почему это свойство не входит в состав IEditableObject
; я еще не выполнил редактируемый объект, который не требовал его.)
Конечно, нет необходимости реализовывать этот второй уровень абстракции, если вам это не нужно - вы можете, конечно, прослушать событие PropertyChanged
и просто предположить, что объект был отредактирован, если он поднят. Это действительно зависит от ваших требований.
Это вызовет исключение для операций Add и Remove, если вы не измените кода, чтобы проверить, что e.NewItems и e.OldItems имеют значение null, прежде чем пытаться просмотреть их. – Alain
Зачем вам этот список ModifiedItems, когда у вас есть коллекция имен? –
См. Мое изменение выше ответа на http://stackoverflow.com/a/36398137/638977 –