Обычный подход заключается в отправке «сигналов» некоторого вида, которые слушает пользовательский интерфейс. В моем коде я часто использую центральный диспетчер, который отправляет сигналы, которые содержат измененный объект, имя поля / свойства плюс старое и новое значение. Для случая oldValue.equals(newValue)
или oldValue.compareTo(newValue) == 0
(последний для дат и BigDecimal
) сигнал не отправляется.
Затем поток пользовательского интерфейса регистрирует прослушиватель для всех сигналов. Затем он проверяет объект и имя, а затем переводит его в изменение пользовательского интерфейса, которое выполняется с помощью asyncExec()
.
Вы можете превратить это в слушателя для каждого объекта и сделать так, чтобы каждый элемент интерфейса регистрировался в модели. Но я обнаружил, что это просто распространяет код повсюду. Когда у меня есть огромный набор объектов с обеих сторон, я иногда просто использую несколько сигналов (или событий), чтобы сделать вещи более управляемыми.