通过更改的RealmList<>更新ListView

时间:2016-05-26 14:47:29

标签: c# listview xamarin realm

假设此数据模型基于realm.io

public class JournalEntry : RealmObject {
        ...
}

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

我有 JournalEntriesPage ,它显示 JournalOwner 的所有 JournalEntry 项目的 ListView

在相应的视图模型中,我将 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

不知何故, JournalEntry ListView 不知道新创建的JournalEntry。

JournalEntriesPage 像这样绑定ListView:

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

如何管理ListView立即显示新创建的条目?

我觉得,我以某种方式需要通知观察者(?)其值的变化。

在相应的情况下,更改

的条目
Owners = _realm.All<JournalOwner>();

强制相应的ListView立即更改。

1 个答案:

答案 0 :(得分:1)

RealmList<T>没有像{Jason指出的那样实现INotifyCollectionChanged,因此无法通知ListView更改。您最好的选择是手动重新加载ListView中的数据。

另一方面,

RealmResults<T>会实现INotifyCollectionChanged(尽管围绕will soon change slightly的API)。这就是为什么绑定到_realm.All<JournalOwner>()的ListView会根据数据库中的更改进行更新的原因。

可观察列表的底层基础架构是there,它在C#级别暴露之前只是时间问题。