Search code examples
c#wpfwpfdatagrid

Control stuck inside an infinite loop because of checkbox events in Datagrid in WPF


I have a datagrid in WPF with first column as a checkbox. I have now added a select all checkbox which appears on the header of the column that it is bound to. The handlers for the select all checkbox and individual row check boxes are defined as:

    private void SelectAllCheckBox_Checked(object sender, RoutedEventArgs e)
    {
        foreach (BaseDataItem objItem in BaseReleaseList)
        {
            objItem.Select = true;
        }
        BaseReleaseDataGridView.Items.Refresh();
    }

    private void SelectAllCheckBox_Unchecked(object sender, RoutedEventArgs e)
    {
        foreach (BaseDataItem objItem in BaseReleaseList)
        {
            objItem.Select = false;
        }
        BaseReleaseDataGridView.Items.Refresh();
    }


    private void RowCheckBoxUnchecked(object sender, RoutedEventArgs e)
    {
        SelectAllCheckBox.IsChecked = false;
    }

    private void RowCheckBoxChecked(object sender, RoutedEventArgs e)
    {
        if (AreAllCheckBoxesChecked())
            SelectAllCheckBox.IsChecked = true;
        else
            SelectAllCheckBox.IsChecked = false;

        BaseReleaseDataGridView.Items.Refresh();
    }


    private bool AreAllCheckBoxesChecked()
    {
        foreach (BaseDataItem objItem in BaseReleaseList)
        {
            if (!objItem.Select)
                return false;
        }
        return true;
    }

Now the problem is that whenever i click on the select all checkbox or the row check box, control gets stuck inside an infinite loop. Reason is that whenever i set, select to true or false, it again fires an event. How can this be handled.


Solution

  • Instead of tapping two events Checked and UnChecked, register to Click event. Click event will be raised on when user clicks on the checkbox unlike Checked/UnChecked which get called even when you check/uncheck your checkbox programatically.

     <CheckBox Name="SelectAllCheckBox" Click="SelectAll_OnClick"></CheckBox>
    

    in handler

        private void SelectAll_OnClick(object sender, RoutedEventArgs e)
        {
            bool? isChecked = SelectAllCheckBox.IsChecked;
            if (isChecked.HasValue)
            {
                foreach (BaseDataItem objItem in BaseReleaseList)
                {
                    objItem.Select = isChecked;
                }
                BaseReleaseDataGridView.Items.Refresh();
            }
    
        }