Событие Combobox selectionchanged срабатывает даже без изменения выбора в ComboBox

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

Не удается заставить работать каскадные поля со списком

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

 <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);

    }

person MangoTable    schedule 16.02.2011    source источник
comment
вы написали код, private void comboBox1_SelectionChanged (отправитель объекта, SelectionChangedEventArgs e) или он был создан SDK?   -  person clamchoda    schedule 17.02.2011


Ответы (4)


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

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

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

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)     { 
   if(!IsLoaded){
      return;
   }
   .... your code here
person HCL    schedule 16.02.2011
comment
Спасибо HCL за ответ. - person MangoTable; 17.02.2011
comment
Спасибо, HCL, за ответ. Я попытался поместить код в событие SelectionChanged, и это не сработало, я думаю, причина в том, что он попадает в код внутри события comboBoxSelection после запуска события, к тому времени данные уже загружается, поэтому он движется дальше и выполняет код. мы должны остановить выполнение события selectionChanged во время загрузки окон. Интересно, почему оно даже срабатывает, когда выбор в поле со списком даже не изменяется? - person MangoTable; 17.02.2011

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

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

Я знаю, что это старый вопрос, но я дважды сталкивался с ним, пытаясь исправить это в своем проекте, и получил те же результаты, что и ОП. Мой список заполняется после того, как IsLoaded имеет значение true. Итак, я решил опубликовать то, что я понял для других. Просто используйте событие DropDowOpened, чтобы установить для логического значения значение 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
person dwebb    schedule 22.05.2016
comment
Есть еще один вопрос, связанный с тем же самым (вы можете найти его здесь). Там в основном тот же подход. Но +1, потому что я наткнулся на это здесь и нашел ваш ответ. Спасибо :) - person iam.Carrot; 15.01.2021

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

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

person Jusarg.com    schedule 13.06.2013