CridControl: программно выставить IsChecked во всех rows

Рейтинг: 1Ответов: 1Опубликовано: 29.11.2014

Есть:

XAML:

<dxg:GridControl x:Name="GridControl_AllPC" Margin="0" Height="370" Width="245">
<dxg:GridControl.Columns>
<dxg:GridColumn FieldName="Выбор" Width="50"HorizontalHeaderContentAlignment="Center"  Binding="{Binding Выбор, Mode=TwoWay}" VisibleIndex="0">
</dxg:GridColumn>
<dxg:GridColumn FieldName="Бот" Width="140" HorizontalHeaderContentAlignment="Center" Binding="{Binding Бот, Mode=OneWay}"  VisibleIndex="1"/>
</dxg:GridControl.Columns>

Привязанная коллекция:

public static ObservableCollection<DataGridSource> PcCollection = new ObservableCollection<DataGridSource>();

    public class DataGridSource
        {
        // Хандлер
        private event PropertyChangedEventHandler PropertyChanged;

        // Выбор
        private bool _DG_CheckBox;
        public bool Выбор
        {
            get
            {
                return this._DG_CheckBox;
            }
            set
            {
                this._DG_CheckBox = value;
                NotifyPropertyChanged();
            }
        }

        // Бот 
        private string _DG_Bot;
        public string Бот
        {
            get
            {
                return this._DG_Bot;
            }
            set
            {
                this._DG_Bot = value;
                NotifyPropertyChanged();
            }
        }

        // Реализация INotifyPropertyChanged
        private void NotifyPropertyChanged([CallerMemberName] string propertyName = "")
        {
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
            }
        }

        // Переопределяем Equals для объекта
        public override bool Equals(object obj)
        {
            // Если объект NULL возвращаем false
            if (obj == null)
            {
                return false;
            }

            // Если параметр не может быть приведен к данному типу возвращаем false
            DataGridSource s = obj as DataGridSource;
            if ((object)s == null)
            {
                return false;
            }

            // Возвращет true если поля совпадают
            return (Бот == s.Бот);
        }

        // Переопределяем Equals для тип
        public bool Equals(DataGridSource s)
        {
            // Если объект NULL возвращаем false
            if ((object)s == null)
            {
                return false;
            }

            return (Бот == s.Бот);
        }

        // Переназначаем GetHashCode
        public override int GetHashCode()
        {
            return Бот.GetHashCode();
        }
    }

Есть кнопка "Выбрать все\снять выбор", в задачу которой входит выставить все чекбоксы в колонке "Выбор" в true\false. Делаю-то через коллекцию так:

if (!Bot_IsSelectAll)
            {
                Bot_IsSelectAll = true;

                foreach (var item in PcCollection)
                {
                    if (!item.Выбор)
                    {
                        item.Выбор = true;
                    }
                }
            }
            else
            {
                Bot_IsSelectAll = false;

                foreach (var item in PcCollection)
                {
                    if (item.Выбор)
                    {
                        item.Выбор = false;
                    }
                }
            }

Но, к сожалению, данный вариант не срабатывает. В чем может заключаться проблема?

Ответы

▲ 2Принят

Хм. Мне кажется, вы неправильно оповещаете об изменениях.

Попробуйте так:

public class DataGridSource : INotifyPropertyChanged // добавили интерфейс
{
    // превращаем private в public
    public event PropertyChangedEventHandler PropertyChanged;

Поскольку event был private, его никто не видел, соответственно и подписаться на него никто не мог. Да и никто о нём не знал, т. к. не был заявлен интерфейс INotifyPropertyChanged.