2016-05-26 6 views
0

Пусть эта модель данных на основе realm.io:Обновление ListView по измененному RealmList <>

public class JournalEntry : RealmObject { 
     ... 
} 

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

У меня есть JournalEntriesPage, которые показывают в ListView всех JournalEntry пунктов в JournalOwner.

Внутри соответствующей модели представления, я прохожу JournalOwner в конструктор и присвоить JournalOwner.Entries свойству записи.

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); 

    } 

Если добавить JournalEntry через пользовательский интерфейс, он будет создаваться, но не появляется в ListView.

Если я двигаюсь вверх по навигации (к JournalOwner), а затем вплоть до записей владельца, ListView показывает недавно созданный JournalEntry.

Каким-то ListView из JournalEntry с не знает о вновь созданном JournalEntry.

JournalEntriesPage связывает ListView следующим образом:

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

Как я заведовать ListView показать вновь созданные записи сразу?

Я чувствую, что мне как-то нужно сообщить наблюдателям (?) О том, что его значение изменилось.

В соответствующей ситуации, изменения в записях

Owners = _realm.All<JournalOwner>(); 

ли заставить соответствующий ListView немедленно изменить.

+2

RealmList должен реализовать INotifyCollection, измененный для того, чтобы ListView был уведомлен об обновлениях. – Jason

+0

@Jason Если в другом классе изменения в _realm.All () действительно отражены в ListView, не реализует ли RealmList INotifyCollection? – SteAp

+0

Я еще не справился с Realm, поэтому не могу сказать точно – Jason

ответ

1

RealmList<T> не реализует INotifyCollectionChanged как @Jason указал и поэтому не может уведомлять ListView об изменениях. Лучше всего было бы вручную перезагрузить данные в ListView.

RealmResults<T> с другой стороны действительно реализует INotifyCollectionChanged (хотя API около этого will soon change slightly). Вот почему ListView привязан к _realm.All<JournalOwner>() обновлениям в соответствии с изменениями в базе данных.

Основой инфраструктуры для наблюдаемых списков является there, это всего лишь вопрос времени, прежде чем он будет показан на уровне C#.

+0

Вот что я ищу. Внутри JournalEntryDetailsPage. Как перезагрузить данные в ListView? Или я могу использовать другой тип как источник привязки ListView? Но какой тип? – SteAp

+0

Я знаю, что это может показаться глупым, но реализация 'INotifyPropertyChanged' на' JournalEntriesViewModel' и создание события 'PropertyChanged' для свойства' Entries' должно принудительно переписать ListView. – Tayschrenn