从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属性,在类Person
说IsManager
并将其与你的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 } }