Вас беспокоит асинхронность функции запроса, и это так, но только в отношении того, что следует за функцией. Вы помещаете ваши stationNames в новый массив внутри функции обратного вызова, которая будет выполняться последовательно.
Я не уверен, есть ли для этого переопределение, но я сомневаюсь в этом.
В случае сомнений используйте ручное связывание? : -} Серьезно, поведение привязки по умолчанию будет - ну - по умолчанию, поэтому, если вам нужно особое поведение, ручная привязка - лучший выбор. При ручной привязке вы можете сохранить позицию прокрутки и сбросить ее после добавления элементов.
Создайте CollectionView. Попробуйте следующее:
private ObservableCollection<int> m_Values;
private CollectionView m_View;
private void Bind()
{
m_Values = new ObservableCollection<int>();
m_View = new CollectionView(m_Values);
MyListBox.ItemsSource = m_View;
}
private void MyListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
Debug.WriteLine(m_View.CurrentItem);
Debug.WriteLine(m_View.CurrentPosition);
}
Вы контролируете, когда что-то добавляется? Я имею в виду, у вас есть одна или две определенные точки, в которых данные изменяются? Если это так, одно простое решение (возможно, не изящное) было бы иметь локальную переменную int для хранения текущего ListBox.SelectedIndex. Непосредственно перед изменением данных сохраните selectedIndex в этой переменной, а после добавления данных установите для SelectedIndex listBox значение этой переменной.