从DataGrid的DataGridTemplateColumn获取Checkbox值

我有这个XAML

           

我尝试使用此代码获取Checked State

 for( int i = 0 ; i < grdData.Items.Count ; i++ ) { DataGridRow row = ( DataGridRow )grdData.ItemContainerGenerator.ContainerFromIndex( i ); var cellContent = grdData.Columns[ 1 ].GetCellContent( row ) as CheckBox; if( cellContent != null && cellContent.IsChecked == true ) { //some code } } 

我的代码错了?

因为您循环遍历Items集合的Items集合。 为什么不在你的类中拥有bool property并从那里获取它。

假设ItemSource是List ,然后创建一个bool属性,在类PersonIsManager并将其与你的checkBox绑定,如下所示 –

  

现在你可以循环遍历Items以获得这样的值 –

 foreach(Person p in grdData.ItemsSource) { bool isChecked = p.IsManager; // Tells whether checkBox is checked or not } 

编辑

如果您无法创建属性,我建议使用VisualTreeHelper方法来查找控件。 使用此方法查找子项(也许您可以将它放在某个实用程序类中并使用它,因为它的通用) –

 public static T FindChild(DependencyObject parent, string childName) where T : DependencyObject { // Confirm parent is valid. if (parent == null) return null; T foundChild = null; int childrenCount = VisualTreeHelper.GetChildrenCount(parent); for (int i = 0; i < childrenCount; i++) { var child = VisualTreeHelper.GetChild(parent, i); // If the child is not of the request child type child T childType = child as T; if (childType == null) { // recursively drill down the tree foundChild = FindChild(child, childName); // If the child is found, break so we do not overwrite the found child. if (foundChild != null) break; } else if (!string.IsNullOrEmpty(childName)) { var frameworkElement = child as FrameworkElement; // If the child's name is set for search if (frameworkElement != null && frameworkElement.Name == childName) { // if the child's name is of the request name foundChild = (T)child; break; } } else { // child element found. foundChild = (T)child; break; } } return foundChild; } 

现在使用上面的方法来获取复选框的状态 –

 for (int i = 0; i < grd.Items.Count; i++) { DataGridRow row = (DataGridRow)grd.ItemContainerGenerator.ContainerFromIndex(i); CheckBox checkBox = FindChild(row, "chb"); if( checkBox != null && checkBox.IsChecked == true ) { //some code } }