Я думаю, вы на правильном пути. У вас может быть событие TextChanged в TextBox, и после изменения текста, если есть хотя бы 3 символа, вы порождаете всплывающее окно со списком результатов, и у списка есть свое событие SelectionChanged, установленное для установки текста TextBox и убить его родительское всплывающее окно. Вы, вероятно, должны проверить, существует ли уже созданное всплывающее окно, и убить его, если появится новый персонаж. Вы можете даже поместить всплывающее окно в таймер, поэтому, если они быстро набирают пять символов, вы создаете всплывающее окно только после секунда простоя (исключая два посторонних всплывающих окна).
Я не знаю хорошего примера, но я сделал нечто подобное (возможно, даже именно это, я не помню), и это действительно не будет так сложно.
Единственное, что смущает меня, это когда вы говорите:
Для этого я бы хотел иметь
TextBox и всплывающее окно с поиском
TextBox и ListBox.
Я не понимаю второй TextBox там. Вам нужно только первое.