Ich habe ein ViewModel, das beim Ausführen eines Befehls Elemente von einem Dienst abruft und diese Elemente zu einer ObservableCollection hinzufügt. Die ObservableCollection ist an eine ListView gebunden.Xamarin Forms - Änderungen an ObservableCollection aktualisieren die Ansicht nicht
Mein Problem ist, dass das Hinzufügen von Elementen zur ObservableCollection nicht automatisch die Ansicht aktualisiert - die ListView bleibt leer. Wenn ich OnPropertyChanged(nameof(ItemList))
rufe, dann wird das ListView aktualisiert - aber sollte nicht die ObservableCollection dafür Sorge tragen, dies zu erhöhen?
Ich verwende die neuesten Xamarin.Forms (2.3.4.247). Dieses Problem betrifft nur Android - wenn ich unter iOS laufe, funktioniert es einwandfrei.
Das Ansichtsmodell, die INotifyPropertyChanged
implementiert:
public class ListViewModel : ViewModelBase
{
private readonly IService m_Service;
public ListViewModel(IService service)
{
m_Service = service;
ItemList = new ObservableCollection<Item>();
RefreshCommand = new Command(async() => await RefreshData());
}
public ICommand RefreshCommand {get;set;}
public ObservableCollection<Item> ItemList { get; private set; }
private async Task RefreshData()
{
ItemList.Clear();
var newItems = await m_Service.GetItems();
if(newItems != null) {
foreach(var n in newItems)
{
ItemList.Add(new ItemViewModel() { Title = n.Title });
}
}
}
Der Artikel Viewmodel (die auch INotifyPropertyChanged)
implementiert:
public class ItemViewModel : ViewModelBase
{
private string m_JobTitle;
public ItemViewModel()
{
}
public string Title
{
get { return m_Title; }
set
{
m_Title = value;
OnPropertyChanged(nameof(Title));
}
}
}
Der 'Liste' Ausblick:
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:ui="clr-namespace:Test.Mobile.UI;assembly=Test.Mobile.UI"
x:Class="Test.Mobile.UI.MyListView">
<ContentView.Content>
<StackLayout Orientation="Vertical">
<ListView ItemsSource="{Binding ItemList}">
<ListView.ItemTemplate>
<DataTemplate>
<ViewCell>
<ui:ItemView></ui:ItemView>
</ViewCell>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</StackLayout>
</ContentView.Content>
</ContentView>
Das 'Item' Ansicht:
<?xml version="1.0" encoding="UTF-8"?>
<ContentView xmlns="http://xamarin.com/schemas/2014/forms"
xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
xmlns:enums="clr-namespace:Test.Mobile.Models.Enums;assembly=Test.Mobile.Models"
x:Class="Test.Mobile.UI.JobItemView">
<ContentView.Content>
<Label Text={Binding Title}/>
</ContentView.Content>
</ContentView>
Welche Plattform Sie laufen auf verwenden? Manchmal gibt es Probleme, bei denen nur ItemList = new ObservableCollection- (newItems) gesetzt werden muss; in Ihrer RefreshData-Methode –
Welches Paket verwenden Sie für ViewModelBase? MvvmLight? –
Ich habe das Problem auf Android. Ich habe gerade getestet und iOS funktioniert korrekt. Ich habe auch versucht, ItemList = new ObservableCollection- (newItems) ;, aber die Ansicht wird immer noch nicht aktualisiert, wenn ich OnPropertyChanged aufrufen. Ich frage mich, ob es nur ein seltsames Xamarin/Android Problem ist? –
spaceplane