I slept on it. This is the solution:
<DataTemplate DataType="{x:Type sync:SyncObject}">
<Grid HorizontalAlignment="Stretch" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" HorizontalAlignment="Stretch" ShowGridLines="True">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="70"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<ToggleButton IsChecked="{Binding IsKept}" Style="{DynamicResource IsKeptStyle}" Width="50" Grid.Column="0" HorizontalAlignment="Left"/>
<TextBlock Text="{Binding Name}" Grid.Column="1" HorizontalAlignment="Left"/>
</Grid>
<ListView ItemsSource="{Binding Properties}" Grid.Row="1" HorizontalAlignment="Stretch" BorderThickness="0" Grid.IsSharedSizeScope="True"/>
</Grid>
</DataTemplate>
Instead of stuffing everything into one grid with two rows and letting the rows do all the work of sorting out the column spacing (i.e. Grid.ColumnSpan="2"
), I created a grid with two rows, but row one is a grid that handles the column spacing.