Элемент управления застрял внутри бесконечного цикла из-за событий флажка в Datagrid в WPF

У меня есть сетка данных в 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;
    }

Теперь проблема в том, что всякий раз, когда я нажимаю флажок «Выбрать все» или флажок «Строка», управление застревает внутри бесконечного цикла. Причина в том, что всякий раз, когда я устанавливаю, выбираю значение true или false, оно снова запускает событие. Как с этим можно справиться.


person The King    schedule 03.06.2014    source источник
comment
Нет, идея состоит в том, чтобы НЕ запускать этот цикл для выбора строк. Я бы использовал RoutedEventArgs.Source (или что-то подобное), чтобы проверить, была ли строка запускающей событие или заголовок.   -  person Tarec    schedule 03.06.2014
comment
Добро пожаловать в мир плохой реализации! Если вы останетесь там, вам лучше привыкнуть к такого рода проблемам. С другой стороны, если бы вы правильно использовали WPF (используя привязку данных), у вас не было бы ни одной из этих проблем, потому что вам нужно было бы только установить свойства bool, которые были привязаны к данным к Checkboxes, на true: foreach (Item item in Items) item.BoolProperty = true;   -  person Sheridan    schedule 03.06.2014


Ответы (1)


Вместо того, чтобы касаться двух событий Checked и UnChecked, зарегистрируйтесь на событие 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();
        }

    }
person Nitin    schedule 03.06.2014
comment
Событие Click не будет вызываться, когда вы устанавливаете/снимаете флажок программно. он будет вызываться только тогда, когда пользователь нажмет на флажок - person Nitin; 03.06.2014
comment
был ли этот вопрос продолжением вашего предыдущего вопроса? показывает флажок в заголовке? - person Nitin; 03.06.2014