Ampliando el concepto de DataGridCell mencionado anteriormente, esto es lo que usamos para que funcione.
... XAML ...
<DataGrid Grid.ColumnSpan="2" Name="dgMissingNames" ItemsSource="{Binding Path=TheMissingChildren}" Style="{StaticResource NameListGrid}" SelectionChanged="DataGrid_SelectionChanged">
<DataGrid.Columns>
<DataGridTemplateColumn CellStyle="{StaticResource NameListCol}">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox IsChecked="{Binding Path=Checked, UpdateSourceTrigger=PropertyChanged}" Name="theCheckbox" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
<DataGridTextColumn Binding="{Binding Path=SKU}" Header="Album" />
<DataGridTextColumn Binding="{Binding Path=Name}" Header="Name" "/>
<DataGridTextColumn Binding="{Binding Path=Pronunciation}" Header="Pronunciation" />
</DataGrid.Columns>
</DataGrid>
TheMissingChildren es un objeto ObservableCollection que contiene la lista de elementos de datos que incluyen un campo booleano "marcado" que utilizamos para rellenar la cuadrícula de datos.
El código SelectionChanged aquí establecerá el booleano comprobado en el objeto TheMissingChildren subyacente y activará una actualización de la lista de elementos. Eso asegura que la casilla se marcará & para mostrar el nuevo estado, sin importar dónde haga clic en la fila. Al hacer clic en la casilla de verificación o en algún lugar de la fila, se activará/desactivará la verificación.
private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
DataGrid ThisGrid = (DataGrid)sender;
CheckedMusicFile ThisMusicfile = (CheckedMusicFile)ThisGrid.SelectedItem;
ThisMusicfile.Checked = !ThisMusicfile.Checked;
ThisGrid.Items.Refresh();
}