This maybe by design but is was unexpected.
If you read the returned value (MessageDisplayByValue.Value) from ValueChanged event, the value that is returned is the value you are changing from (old value).
If you read the returned value from TextChanged event, the value that is returned is the value you are changing to (new value).