Я пытаюсь загрузить список со списком элементов, извлекаемых из веб-службы OData.Выборка данных работает хорошо, и я получаю список элементов.Список действительно работает и отображает элементы, но не каждый раз, когда я запускаю приложение ... Из-за необходимости асинхронной обработки данных иногда список загружается до того, как данные возвращаются.Когда это происходит, я передаю ему список с одним «пустым» элементом, чтобы указать, что данные все еще загружаются.Через несколько секунд данные загрузились, и я вызвал событие PropertyChanged для списка.Моя точка останова в свойстве списка срабатывает, и когда я проверяю, список содержит правильные элементы.Но список не отображает новые элементы, только старый «пустой» элемент.Мне кажется странным, что xaml явно запрашивает список, но затем не обновляет макет для новых элементов.
Сначала код, инициализирующий ViewModel.ModelReferenceMap реализует INotifyPropertyChanged и поэтому должен обновлять представление, когда OnPropertyChanged ("Области");вызывается (это вызывает выборку списка из свойства, но не обновляет представление).
public ModelReferenceMap(Uri serviceURI)
{
// Try initialising these lists to a non null but empty list
// in the hope it will stop the lists breaking when the service
// is a little bit slow...
areas = new List<ModelReferenceItem> { new ModelReferenceItem(null) };
// This is a ServiceReference entity context which will retrieve the data from the OData service
context = new LiveEntities(serviceURI);
// SendingRequest adds credentials for the web service
context.SendingRequest += context_SendingRequest;
// The query to retrieve the items
var areaQuery = from i in context.MigrationItems where i.FusionPTID == 0 && i.Type == "AreaType" orderby i.Name select i;
// On completion this asynccallback is called
AsyncCallback ac = iasyncResult =>
{
// Populates the List with the data items
areas = (from i in ((DataServiceQuery<MigrationItem>) areaQuery).EndExecute(iasyncResult)
select new ModelReferenceItem(i)).ToList();
foreach (ModelReferenceItem area in areas)
{
if (selectedArea == null)
selectedArea = area;
area.PropertyChanged += referenceItem_PropertyChanged;
}
// The Xaml Listbox has its ItemsSource bound to the Areas property. This should trigger a refresh of the listbox contents shouldn't it?
OnPropertyChanged("Areas");
OnPropertyChanged("SelectedArea");
};
// Start the query
((DataServiceQuery<MigrationItem>)areaQuery).BeginExecute(ac, null);
}
Теперь XAML.Обратите внимание, что DataContext списка - это ReferenceMap (свойство в моей основной ViewModel, которая предоставляет единый экземпляр ModelReferenceMap).Затем я связал ItemsSource с областями.
<ListBox Grid.Row="0" DataContext="{Binding ReferenceMap}" ItemsSource="{Binding Areas}" SelectedItem="{Binding SelectedArea, Mode=TwoWay}" HorizontalAlignment="Stretch" Margin="3" Name="listBoxFusionAreas" VerticalAlignment="Stretch">
<ListBox.ItemContainerStyle>
<Style TargetType="ListBoxItem">
<Setter Property="HorizontalContentAlignment" Value="Stretch"/>
</Style>
</ListBox.ItemContainerStyle>
<ListBox.ItemTemplate>
<DataTemplate>
<Grid Background="{Binding CompleteStatusColour}">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock FontSize="12" Text="{Binding Name}" />
<TextBlock Grid.Column="1" FontSize="12" Text="{Binding Count}"/>
</Grid>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Правильное срабатывание свойства Areas указывает на то, что привязка работает.Когда Области запрашиваются только ПОСЛЕ служебных данных (то есть только один раз), список работает отлично.Однако, если свойство Areas сработало до возврата служебных данных (т. Е. С единственным «пустым» элементом), оно снова сработает во время OnPropertyChanged («Areas»);вызов с полным набором элементов, только в этот раз в списке все еще отображается исходный «пустой» элемент.
Что я делаю не так?