В идеале вы должны привязать IsChecked к свойству в строке, т.е.
<CheckBox Content="{Binding personname}" IsChecked="{Binding IsPersonChecked}" Name="thecheckbox"/>
где «IsPersonChecked» - это столбец в вашей таблице данных (или то, к чему вы привязываете), точно так же как «имя пользователя» Затем вы можете прочитать, проверяется ли он непосредственно из вашей переменной DataRow:
DataRow row = ((DataRowView)thelistbox.SelectedValue).Row;
bool isPersonChecked = (bool) row["IsPersonChecked"];
Если DataSet напечатан, вы, очевидно, хотите использовать типизированные свойства DataRow.
Обратите внимание, что я использовал SelectedValue, а не свойство SelectedItem. Я считаю, что SelectedItem на самом деле является экземпляром ListBoxItem. Который вы можете использовать, если хотите оставить свой IsChecked свободным. Тогда вам придется получить CheckBox с учетом полной иерархии шаблонов. Что-то вроде:
bool isChecked = ((CheckBox)((StackPanel) ((ListBoxItem) thelistbox.SelectedItem).Content).Children[0]).IsChecked ?? false;
Грязный. (Отладка и настройка иерархии в соответствии с тем, что вы на самом деле получите. Мой код, вероятно, не будет работать как есть.)
Лучше всего использовать RoutedEventArgs вашего обработчика CheckBox_Checked:
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
CheckBox checkBox = (CheckBox) e.Source;
DataRow row = ((DataRowView) checkBox.DataContext).Row;
bool isChecked = checkBox.IsChecked ?? false;
}