ItemsControl
слушает CollectionChanged
, чтобы управлять отображением коллекции предметов, представляемых на экране.A ContentControl
слушает PropertyChanged
, чтобы управлять отображением определенного элемента, который он представляет на экране.Когда вы это поймете, довольно легко сохранить в уме эти две концепции.
Отслеживание того, редактируется ли элемент, не является чем-то, что делает один из этих интерфейсов.Изменения свойств не являются изменениями, то есть они не обязательно представляют собой какое-то инициированное пользователем изменение состояния объекта.Например, объект может иметь свойство ElapsedTime
, которое постоянно обновляется таймером;пользовательский интерфейс должен быть уведомлен об этих событиях изменения свойств, но они определенно не представляют изменений в базовых данных объекта.
Стандартный способ отследить, отредактирован ли объект, состоит в том, чтобы сначала сделать этообъект реализует IEditableObject
.Затем вы можете, внутри класса объекта, решить, какие изменения составляют редактирование (т. Е. Требуют, чтобы вы вызвали BeginEdit
), а какие нет.Затем вы можете реализовать логическое свойство IsDirty
, которое устанавливается при вызове BeginEdit
и очищается при вызове EndEdit
или CancelEdit
.(Я действительно не понимаю, почему это свойство не является частью IEditableObject
; я еще не реализовал редактируемый объект, который ему не нужен.)
Конечно, нет необходимости реализовыватьэтот второй уровень абстракции, если он вам не нужен - вы, конечно, можете прослушать событие PropertyChanged
и просто предположить, что объект был отредактирован, если он был поднят.Это действительно зависит от ваших требований.