简体   繁体   中英

Get Checkbox Value From DataGridTemplateColumn of DataGrid

I have this XAML

<DataGrid Name="grdData" ... >
   <DataGrid.Columns>
      <DataGridTemplateColumn Header="Something">
         <DataGridTemplateColumn.CellTemplate>
            <DataTemplate>
               <CheckBox Name="chb" />
            </DataTemplate>
         </DataGridTemplateColumn.CellTemplate>
       </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

i try this code to get 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
    }
}

my code is wrong?

Since you are looping over the Items collection which is your ItemsSource . Why not to have the bool property in your class itself and get it from there itself.

Say if ItemSource is List<Person> , then create a bool property say IsManager in class Person and bind it with your checkBox like this -

<CheckBox IsChecked="{Binding IsManager}"/>

Now you can loop over the Items to get the value like this -

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

EDIT

In case you can't create a property, i would suggest to use the VisualTreeHelper methods to find the control. Use this method to find the child (Maybe you can place this in some utility class and use it, since its generic) -

public static T FindChild<T>(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<T>(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;
}

Now use the above method to get the state of your checkbox -

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM