2017-06-23 2 views
2

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> 
+0

Welche Plattform Sie laufen auf verwenden? Manchmal gibt es Probleme, bei denen nur ItemList = new ObservableCollection (newItems) gesetzt werden muss; in Ihrer RefreshData-Methode –

+0

Welches Paket verwenden Sie für ViewModelBase? MvvmLight? –

+0

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

Antwort

1

Welche Version von Xamarin Forms verwenden Sie?

  • Aktualisieren Sie Ihr Projekt auf die neueste Version
  • Wenn Sie immer noch das Problem mit, nach dem Hinzufügen die alle Elemente versuchen Sie dies: ItemList = new ObservableCollection (newItems);
  • Wenn das nicht funktioniert, könnte ein Problem in Ihrer ViewModelBase auftreten. Für Handle Property ich dieses schöne Paket https://github.com/Fody/PropertyChanged
+0

Ich bin auf der neuesten Version (2.3.4.247). Ich glaube nicht, dass dies ein Problem mit meiner ViewModelBase ist, da alle anderen gebundenen Eigenschaften korrekt aktualisiert werden. Wenn Sie das PropertyChanged-Ereignis spezifisch erhöhen, wird die Ansicht aktualisiert. Ich denke, es gibt entweder eine seltsame Eigenart oder ich mache irgendwo einen dummen Fehler, den ich nicht sehen kann. – spaceplane

Verwandte Themen