Событие в выпадающем списке «Выбранное» вызывает события, даже не меняя выбор в ComboBox - PullRequest
7 голосов
/ 17 февраля 2011

Не могли бы вы помочь мне найти ошибку в этом: Событие срабатывает до того, как загружается даже форма Windows.Я начинаю видеть сообщение Box, а затем нажимаю кнопку ОК, после чего он загружает главный экран. После того, как все работает отлично, мне интересно, что вызывает событие ComboBox SelectionChanged, прежде чем даже загрузить окно.и помещает значения в 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);

    }

Ответы [ 4 ]

16 голосов
/ 17 февраля 2011

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

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

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

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)     { 
   if(!IsLoaded){
      return;
   }
   .... your code here
3 голосов
/ 13 октября 2016

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

var comboBox = (ComboBox)sender;
if (!comboBox.IsLoaded)
{
    // This is when the combo box is not loaded yet and the event is called.
    return;
}
0 голосов
/ 23 мая 2016

Я знаю, что это старый вопрос, но я дважды сталкивался с ним, пытаясь исправить это в своем проекте, и у меня были те же результаты, что и у ОП.Мой список заполняется после истины IsLoaded.Итак, я решил опубликовать то, что я понял для других.Просто используйте событие 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
0 голосов
/ 13 июня 2013

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

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

...