Risolto,
ho aggiunto una property al mio modello:

codice:
[DisplayName("IsChecked")]
public bool IsChecked { get; set; }
nel mio CS ho inserito:
codice:
private void HeadCheck(object sender, RoutedEventArgs e, bool IsChecked)
{
	var items = dgPlan.Items.OfType<AnalysisPlanItem>();
	foreach (var item in items)
	{
		item.IsChecked = IsChecked;
	}


	dgPlan.Items.Refresh();
}


private void chkbxSelectAll_Checked(object sender, RoutedEventArgs e)
{
	HeadCheck(sender, e, true);
}


private void chkbxSelectAll_Unchecked(object sender, RoutedEventArgs e)
{
	HeadCheck(sender, e, false);
}
nello XAML:
codice:
<DataGridTemplateColumn>
	<DataGridTemplateColumn.Header>
		<CheckBox Name="chkbxSelectAll" Checked="chkbxSelectAll_Checked" Unchecked="chkbxSelectAll_Unchecked" />
	</DataGridTemplateColumn.Header>
	<DataGridTemplateColumn.CellTemplate>
		<DataTemplate>
			<CheckBox x:Name="CheckBox" IsChecked="{Binding IsChecked}" PreviewMouseLeftButtonDown="CheckBox_PreviewMouseLeftButtonDown" />
		</DataTemplate>
	</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
Il mio obiettivo era non intaccare il modello...ma alla fine si è rilevata la strada più semplice.