2016-05-26 11 views
0

dieses Datenmodell auf realm.io basierend Angenommen:Aktualisierung Listview durch geändert Realmlist <>

public class JournalEntry : RealmObject { 
     ... 
} 

public class JournalOwner : RealmObject { 
     ... 
     public RealmList<JournalEntry> Entries { get; } 
} 

Ich habe ein JournalEntriesPage, die zeigen eine Listview aller JournalEntry Elemente einer JournalOwner.

Im Inneren der entsprechenden Ansicht Modell, passiere ich die JournalOwner an den Konstruktor und weisen Sie den JournalOwner.Entries auf die Eigenschaft Einträge.

public class JournalEntriesViewModel { 

     private Realm _realm; 

    private JournalOwner _owner; 
    public RealmList<JournalEntry> Entries { 
     get { return _owner.Entries; } 
    } 
    .... 
    public JournalEntriesViewModel(JournalOwner owner) { 

     _realm = Realm.GetInstance(); 
     _owner = owner; 

     AddEntryCommand = new Command(AddEntry); 
     DeleteEntryCommand = new Command<JournalEntry>(DeleteEntry); 

    } 

Wenn ich ein JournalEntry über die Benutzeroberfläche hinzufügen, es erstellt wird, scheint aber nicht in dem Listview.

Wenn ich die Navigation nach oben (zu JournalOwner) und dann hinunter auf die Einträge des Eigentümers, der Listview zeigt die neu geschaffenen JournalEntry.

Irgendwie der Listview von JournalEntry s nicht weiß, über die neu geschaffene JournalEntry.

Die JournalEntriesPage bindet das Listview wie folgt:

<ListView 
    ItemsSource="{Binding Entries}" 
    x:Name="EntriesListView" 
    ItemTapped="OnItemTapped"  
    ItemSelected="OnItemSelected" > 

Wie Räude ich die Listview sofort neu erstellten Einträge zeigen?

Ich fühle, dass ich Beobachter (?) Von Einträgen irgendwie informieren muss, dass sein Wert sich geändert hat.

In einer entsprechenden Situation, Änderungen der Einträge von

Owners = _realm.All<JournalOwner>(); 

Sie die entsprechende Listview zwingen, sofort zu ändern.

+2

RealmList muss eine geänderte INotifyCollection implementieren, damit ListView über Aktualisierungen benachrichtigt wird. – Jason

+0

@Jason Wenn in einer anderen Klasse Änderungen an _realm.All () in der ListView reflektiert werden, implementiert RealmList nicht INotifyCollection? – SteAp

+0

Ich habe noch keine Hände mit Realm gemacht, also kann ich nicht sicher sagen – Jason

Antwort

1

RealmList<T> implementiert nicht INotifyCollectionChanged als @Jason hat darauf hingewiesen und so kann es nicht die ListView von Änderungen benachrichtigen. Am besten laden Sie die Daten in der ListView manuell neu.

RealmResults<T> auf der anderen Seite implementiert INotifyCollectionChanged (obwohl die API um diese will soon change slightly). Deshalb aktualisiert sich ein ListView, der an _realm.All<JournalOwner>() gebunden ist, entsprechend den Änderungen in der Datenbank.

Die zugrunde liegende Infrastruktur für beobachtbare Listen ist there, es ist nur eine Frage der Zeit, bis sie auf der C# -Ebene verfügbar gemacht wird.

+0

Das ist, was ich suche. In der JournalEntryDetailsPage. Wie lade ich die Daten in der ListView neu? Oder kann ich einen anderen Typ als die Bindungsquelle von ListView verwenden? Aber welcher Typ? – SteAp

+0

Ich weiß, dass es albern klingen mag, aber das Implementieren von 'INotifyPropertyChanged' auf' JournalEntriesViewModel' und das Erhöhen des 'PropertyChanged' -Ereignisses für die' Entries' -Eigenschaft sollte die ListView zwingen, erneut zu binden. – Tayschrenn

Verwandte Themen