Событие ComboBox SelectionChanged неожиданно срабатывает - PullRequest
0 голосов
/ 24 декабря 2009

У меня есть 4 ComboBox, расположенных горизонтально: Названия только для справки.

[Платформы] [Выпуски] [Выпускные позиции] [Выпускные товары]

Моя модель интерфейса для коробок выглядит следующим образом:

  1. Сначала все четыре комбинированных списка отключены (IsEnabled = false)
  2. Когда страница загружается, асинхронный обратный вызов получает данные платформ и связывает их со списком платформ после его включения, а затем вручную добавляет «Все» как элемент.
  3. Пользователь выбирает платформу

  4. Если пользователь выбирает «Все», я делаю следующее: отключаю три других выпадающих списка и вызовите метод Async для повторного связывания данных со списком платформ.
            releasesFilterComboBox.IsEnabled = false;
            releaseItemsFilterComboBox.IsEnabled = false;
            releaseItemProductsFilterComboBox.IsEnabled = false;
    
            mainClient.GetBuildsAsync(null);
    

  5. Если пользователь выбирает какую-либо другую платформу (кроме «Все»), в зависимости от того, какая платформа выбрана, я собираю все элементы, соответствующие платформе, из объекта в DataContext и устанавливаю ItemsSource для Выпускает comboBox для него следующим образом:
BuildsListBox.ItemsSource = platformSelectedBI = from bi in buildInfos where 
                                                bi.GetBuildsResult.ReleasePlatform ==  selectedPlatform
                                                 select bi;
releasesFilterComboBox.IsEnabled = true;
List<String> releaseNumbers = ( from bld in buildInfos.Where(bi => bi.GetBuildsResult.ReleasePlatform == selectedPlatform)
select bld.GetBuildsResult.ReleaseNumber ).ToList();

releaseNumbers.Insert(0, "All");
releasesFilterComboBox.ItemsSource = releaseNumbers.Distinct();
  1. Остальные ComboBox'ы следуют той же самой процедуре, чтобы связать данные и вызвать и действия выполняются в методе, который вызывается при возникновении событий SelectionChanged.

и т. Д. -> то же самое для остальных ящиков.

Моя проблема: после того, как я заполнил хотя бы первые два поля со списком, когда я выбираю

параметр «Все» в ПРЕДЫДУЩЕМ ComboBox, после ожидаемого поведения (другие комбинированные списки отключены), когда я выбираю параметр, отличный от «ВСЕ», событие SelectionChanged запускается для КАЖДОГО КОМБОБОКСА, который был заполнен ранее! (все что было отключено). ###

Просто чтобы уточнить, если это еще не так.

Я выбрал платформу, поэтому выпуски заполнены. Затем я выбрал Релиз, и поэтому элементы Релизов заполняются. Теперь, когда я выбираю «ВСЕ» в выпадающем списке «Платформы», поля «Выпуск» и «Выпуск элементов» отключаются. Затем, когда я выбираю платформу, отличную от «ALL», происходит событие SelectionChanged не только для платформ, но и для Releases и ReleaseItems. Единственное изменение, которое я делаю в комбинированных списках во второй части обработчика событий, это УСТАНОВКА ИСТОЧНИКА ПУНКТОВ, как в приведенном выше коде. Ничего больше.

Почему события SelectionChanged запускаются для других комбинированных списков? Это известная ошибка в выпадающих списках SL? Могу ли я предотвратить это?

Извините, если вопрос и объяснение не очень ясны. Я постараюсь уточнить, если вы спросите меня.

Большое спасибо!

1 Ответ

1 голос
/ 24 декабря 2009

Все сводится к повторному заполнению списков. Один из способов исправить это - удалить обработчики событий при выборе «ВСЕ» и отключить другие поля со списком. Затем, если вы выберете что-то, отличное от «ALL», вы можете установить источники данных, а затем повторно добавить обработчик события изменения выбора.

Другим способом было бы оставить их всех тут же, а затем в выборе «ALL» установить выбранный индекс на -1 (по умолчанию), и в вашем обработчике событий ничего не делать, если он равен -1.

Просто мысль.

...