控件卡在无限循环中,因为WPF中Datagrid中的复选框事件

本文关键字:Datagrid 复选框 事件 WPF 无限循环 控件 因为 | 更新日期: 2023-09-27 18:06:17

我在WPF中有一个数据网格,第一列作为复选框。现在,我添加了一个选中所有复选框,该复选框出现在它所绑定的列的标题上。选择所有复选框和单个行复选框的处理程序定义为:

    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;
    }

现在的问题是,每当我点击选择所有复选框或行复选框,控制被困在一个无限循环。原因是每当我将select设置为true或false时,它都会再次触发一个事件。如何处理?

控件卡在无限循环中,因为WPF中Datagrid中的复选框事件

不轻敲CheckedUnChecked两个事件,而是注册到Click事件。Click事件将在用户单击复选框时引发,不像Checked/UnChecked即使在您以编程方式选中/取消选中复选框时也会被调用。

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

处理程序

    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();
        }
    }