Проблема заключается в том, что родительские элементы предоставляют TextBox столько места, сколько ему кажется необходимым, и при увеличении объема текста он расширяется вместо того, чтобы оставаться в исходном автоматическом размере.
Одним из решений здесь является создание другого элемента с автоматическим размером и привязка к нему TextBox.Width:
<DockPanel>
<TreeView Width="150" DockPanel.Dock="Left"/>
<ScrollViewer HorizontalScrollBarVisibility="Auto" VerticalScrollBarVisibility="Auto">
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
</Grid.RowDefinitions>
<TextBlock Margin="5" VerticalAlignment="Center" Text="Name"/>
<Border x:Name="b" Grid.Column="1" Margin="5"/>
<TextBox Width="{Binding ActualWidth, ElementName=b}"
MinWidth="200"
Grid.Column="1"
Margin="5"
VerticalAlignment="Center"
Text="Some Name"/>
</Grid>
</ScrollViewer>
</DockPanel>
Обратите внимание, что мы устанавливаем свойство Margin элемента авторазмера (Border). Это важно, поскольку, если он не установлен, будет цикл:
- Ширина границы автоматически изменяется до ширины столбца сетки
- Ширина TextBox изменяется до Border.ActualWidth
- Ширина столбца сетки изменяется до ширины TextBox + поле TextBox
- Ширина границы снова автоматически изменяется до ширины столбца сетки
Если задать для поля Margin то же значение, что и для TextBox, изменение размера TextBox не повлияет на размер сетки.