If a control item is modified, the record & block & form status will remain unchanged.
One way around this is to add a trigger (WHEN-VALIDATE-ITEM) to the item to force the record status to change. In the trigger, set the record status to 'CHANGED'. You may need some logic to take care of new records as well, e.g.:
IF GET_RECORD_PROPERTY(NAME_IN ('SYSTEM.TRIGGER_RECORD'),
NAME_IN ('SYSTEM.TRIGGER_BLOCK'),
STATUS) = 'QUERY' THEN
Set_Record_Property (NAME_IN ('SYSTEM.TRIGGER_RECORD'),
NAME_IN ('SYSTEM.TRIGGER_BLOCK'),
STATUS,
CHANGED_STATUS);
ELSIF GET_RECORD_PROPERTY(NAME_IN ('SYSTEM.TRIGGER_RECORD'),
NAME_IN ('SYSTEM.TRIGGER_BLOCK'),
STATUS) = 'NEW' THEN
Set_Record_Property (NAME_IN ('SYSTEM.TRIGGER_RECORD'),
NAME_IN ('SYSTEM.TRIGGER_BLOCK'),
STATUS,
INSERT_STATUS);
END IF;
Alternatively (and this is probably a better method), in your WHEN-VALIDATE-ITEM trigger, set the value of a database item in the same record to some value (as per the other answer here). This will automatically set the record status correctly.