Implementation Details
Instead of controlling each way characters are inputted, I let the base class (TextBox) handle this. After the text is changed, I check if this is a valid value. If not, I perform a rollback to the last known valid value and cursor position.