Триггеры событий ComboBox selectionchanged даже без изменения выбора в ComboBox

Не могли бы вы помочь мне найти ошибку в этом: событие запускается еще до загрузки windows form. Я начинаю видеть окно сообщения, а затем нажимаю OK, после чего он загружает главный экран.После этого все работает отлично, интересно, что вызывает событие ComboBox SelectionChanged еще до загрузки окна.FillComboBoxFamilyData (SegmentCode) просто создает набор данных и помещает значения в поле ComboBox. Пожалуйста, обратитесь к этой ссылке для завершения код.

не в состоянии сделать каскадные comboboxes работать

любая помощь будет высоко ценится.Спасибо.

 <ComboBox Height="23" HorizontalAlignment="Left" Margin="35,26,0,0" Name="comboBox1" VerticalAlignment="Top" Width="205" ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}"  DisplayMemberPath="Segment Name" SelectedValuePath="Segment Code" SelectionChanged="comboBox1_SelectionChanged"/>
 <ComboBox Margin="304,26,395,93" Name="comboBox2" />


    private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {

        MessageBox.Show(comboBox1.SelectedValue.ToString());
        SegmentCode = Convert.ToInt32(comboBox1.SelectedValue.ToString());
        FillComboBoxFamilyData(SegmentCode);

    }

4 ответов


в данный момент данные будут загружены (прикреплены привязкой), SelectionChanged будет запущен. Поэтому вы должны проверить в обработчике событий, если ваше приложение готово, и все данные загружены и прикреплены. Если нет, верните обработчик событий, ничего не делая. Такое поведение является преднамеренным.

ItemsSource="{Binding Source={StaticResource tblSegmentViewSource}}"  

можно использовать IsLoaded - свойство для обнаружения, если привязка уже была оценена. IsLoaded не будет true если DataBinding-engine не оценил ваш xaml-привязки.

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)     { 
   if(!IsLoaded){
      return;
   }
   .... your code here

вы можете использовать свойство IsLoaded поля со списком, чтобы проверить, загружен ли он еще. Это самое чистое и простое решение, которое я мог найти:

var comboBox = (ComboBox)sender;
if (!comboBox.IsLoaded)
{
    // This is when the combo box is not loaded yet and the event is called.
    return;
}

У меня была такая же проблема, и я узнал, что установка начального индекса выбора combox с помощью xaml вызовет событие selectionchanged при загрузке программы, которое вызывает ошибку.

для решения вы можете либо установить selection-index в -1 (по умолчанию) или изменить текущий-выбор-индекс combobox с помощью кода после загрузки программы.


Я знаю, что это старый вопрос, но я столкнулся с ним дважды, пытаясь исправить это в моем проекте и получил те же результаты, что и OP. Мой список заполняется после того, как IsLoaded имеет значение true. Поэтому я решил опубликовать то, что узнал для других. Просто используйте событие DropDowOpened, чтобы установить bool в true. Таким образом, событие SelectionChanged не будет срабатывать, пока пользователь не нажмет на раскрывающийся список.

private bool UserSeriesChange;
private void comboBox1_DropDownOpened(object sender, EventArgs e)
{
        UserSeriesChange = true;    
}

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{ 
   if(!UserSeriesChange){
      return;
   }
   .... your code here