Проблема в том, что составной код не ожидает получения дополнительных входных событий, пока ваш обработчик TextChanged не вернется. Когда вы вызываете Dispatcher.Invoke, он вызывает обработку очереди сообщений Windows, вызывая дополнительные события ввода.
По моему мнению, это является ошибкой, поскольку механизм компоновки должен быть устойчивым к повторному входу при запуске пользовательских событий.