Контролът остана в безкраен цикъл поради събития в полето за отметка в Datagrid в WPF

Имам datagrid в 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 събитие. Събитието за щракване ще бъде повдигнато, когато потребителят щракне върху квадратчето за отметка, за разлика от 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
Събитието за щракване няма да бъде извикано, когато поставите/махнете отметка в квадратчето си програмно. той ще бъде извикан само когато потребителят щракне върху квадратчето за отметка - person Nitin; 03.06.2014
comment
този въпрос продължение на предишния ви въпрос ли беше? показване на квадратчето за отметка в заглавката? - person Nitin; 03.06.2014