Измените ширину вашего третьего ColumnDefinition с «Авто» на «*», чтобы он занимал только то, что осталось от вашего горизонтального пространства.
Чтобы попытаться объяснить это:
Область экрана в WPF распределяется по двухпроходному алгоритму. Сначала каждый визуальный элемент спрашивает каждого ребенка, сколько места ему нужно, с указанием того, сколько доступно. Эти дети делают то же самое для своих детей.
Затем каждый визуальный элемент сообщает каждому ребенку, сколько он на самом деле собирается получить. Эти дети, опять же, делают то же самое для своих детей.
Ваш код не смог выполнить то, что вы хотели, потому что Grid в DataTemplate сообщал дочерним элементам третьего столбца, что они могут иметь все желаемое горизонтальное пространство («авто») при первом запуске. Те текстовые поля тогда думали, что им не придется оборачиваться. Таким образом, они только что сообщили желаемую ширину и высоту в одну строку.
Во втором заезде Грид обнаружил, что «авто» оказалось немного меньше, чем хотели те дети. И Сетка все еще давала им только одну строчку высоты, так что об упаковке не могло быть и речи. Тогда у детей не было другого выбора, кроме как обрезать текст.
Когда ширина третьего столбца установлена на «*», сетка будет точно указывать дочерним элементам в этом столбце, сколько горизонтальных пикселей осталось после того, как первый столбец получил свое «авто», а второй столбец получил их 15. Теперь текстовые поля могут выяснить, что они могут захотеть обернуть, и они сообщают: «Хорошо, папа, я справлюсь с этими жалкими горизонтальными пикселями, но, по крайней мере, дай мне то, что я хочу по вертикали». Вертикальному пространству нет ограничений, поэтому они получают то, что им нужно, чтобы представить все свое великолепное содержание.