WPF provided a property called SharedSizeGroup which allows sizing properties shared between ColumnDefinition or RowDefinition.
And remeber to set Grid.IsSharedSizeScope="True".
However , when we want one column take up all the available space, like the example above. You will find out that even you write Width="*" still doesn't work as SharedSizeGroup will make it as short as possible.
My solution is , Shared all the columns size except the one contain TextBox.
<Grid Grid.IsSharedSizeScope="True">
<Grid.RowDefinitions>
<RowDefinition Height="auto"/>
<RowDefinition Height="auto"/>
</Grid.RowDefinitions>
<Grid Name="Grid1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" SharedSizeGroup="a" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" SharedSizeGroup="c"/>
<ColumnDefinition Width="auto" SharedSizeGroup="d"/>
</Grid.ColumnDefinitions>
....
</Grid>
<Grid Name="Grid2">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" SharedSizeGroup="a" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" SharedSizeGroup="c"/>
<ColumnDefinition Width="auto" SharedSizeGroup="d"/>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="auto" SharedSizeGroup="a" />
<ColumnDefinition Width="*" />
<ColumnDefinition Width="auto" SharedSizeGroup="c"/>
<ColumnDefinition Width="auto" SharedSizeGroup="d"/>
</Grid.ColumnDefinitions>
.........
</Grid>