XAML ComboBox SelectionChanged срабатывает при загрузке

Если у меня есть ComboBox с событием SelectionChanged, оно срабатывает, когда я загружаю элемент управления.

Поэтому при загрузке страницы я устанавливаю SelectedValue, и срабатывает событие SelectionChanged, чего я не хочу.

Каков принятый подход к прекращению этого?


person griegs    schedule 04.05.2010    source источник


Ответы (2)


Два очевидных решения для этого: 1) Подождите, пока не произойдет событие Loaded Window/Page/UserControl, которое содержит ComboBox, и подключите там SelectionChanged... например, в конструкторе:

// set the inital selected index for the combo box here...

this.Loaded += (s, args) =>
               {
                    cmbBox.SelectionChanged += 
                            new SelectionChangedEventHandler(HandleChanged);
               };

или 2) Убедитесь, что ComboBox загружен в обработчик изменения выбора, прежде чем что-либо делать, и вернитесь, если это не так... например, в обработчике:

if (!cmbBox.IsLoaded)
        return;

Я бы предпочел номер 1, так как он не требует проверки каждый раз, когда запускается обработчик SelectionChanged.

person Simon Fox    schedule 04.05.2010
comment
@SANDEEP, как я уже упоминал, поместите его в конструктор (представления, содержащего рассматриваемый элемент управления) - person Simon Fox; 28.03.2015
comment
Вторая часть решения не работает. Во время инициализации выбор изменяется, и событие запускается. Внутри обработчика событий IsLoaded имеет значение true - person Kesty; 13.07.2017
comment
Решение для меня (в дополнение к вышеизложенному) состояло в том, чтобы установить DataContext в конструкторе, а не в обработчике загруженных событий окна. - person Kesty; 13.07.2017

Я столкнулся с конкретной ситуацией:

Если вы используете сводную точку, а управление преждевременным срабатыванием находится в PivotItem> 0, у вас все еще будет проблема.

В этом случае кажется, что this.Loaded() относится только к PivotItem "0", и переход на другой PivotItem в пользовательском интерфейсе все равно вызовет события.

В этом случае решение (с вашим примером):

cmbBox.Loaded += (s, args) =>
           {
                cmbBox.SelectionChanged += 
                        new SelectionChangedEventHandler(HandleChanged);
           };
person Javert    schedule 27.06.2017