Триггеры событий 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