我可以保存ObservableCollection的内容,以便在重新启动应用程序时列表仍然完整吗?

时间:2017-05-31 11:13:47

标签: c# listview xamarin xamarin.forms observablecollection

我想要做的是让用户将项目添加到列表中。然后,当他们添加项目时,我需要保存列表,这样当用户关闭应用程序并再次打开它时,他们创建的列表仍然存在。

现在,我可以将项目添加到我的列表中,但只要我关闭应用程序,它们就会消失。

private static ObservableCollection<ViewModels.ZoneViewModel> Zones = new ObservableCollection<ViewModels.ZoneViewModel>();

    public void PopulateListView(string image, string name, string address)
    {
        if (name != "" && address != "")
        {
            Zones.Add(new ViewModels.ZoneViewModel { Image = image, Name = name, Address = address });

            Application.Current.Properties["zoneslist"] = Zones;
        }
    }

    protected override void OnAppearing()
    {
       if (Application.Current.Properties.ContainsKey("zoneslist"))
       {
          // Put the contents of the "zoneslist" key into a variable as a string.
          var savedZones = Application.Current.Properties["zoneslist"] as ObservableCollection<ViewModels.ZoneViewModel>;

           // Set the listviews' itemssource to the savedzones list.
           zonesList.ItemsSource = savedZones;
       }
    }

这里是我现在使用的代码,我认为这可以用来保存它,但这不起作用。

编辑:所以我已经尝试了@Alessandro Calario的建议,在使用json序列化之后,listview只给了我很多空列表项(即使我只添加了一个)。但是即使应用程序关闭,也会添加并保存项目。至少进步,但我还没有完成。有人知道解决方案吗?

我的代码:

public void PopulateListView(string image, string name, string address)
{
    if (name != "" && address != "")
    {
        Zones.Add(new ViewModels.ZoneViewModel { Image = image, Name = name, Address = address });

        //Serialize to json string
        var json = JsonConvert.SerializeObject(Zones);

        Application.Current.Properties["zoneslist"] = json;
    }
}

protected override void OnAppearing()
{
    if (Application.Current.Properties.ContainsKey("zoneslist"))
    {
        // Put the contents of the "zoneslist" key into a variable as a string.
        var savedZones = Application.Current.Properties["zoneslist"] as string; //ObservableCollection<ViewModels.ZoneViewModel>

        JsonConvert.DeserializeObject<ObservableCollection<ViewModels.ZoneViewModel>>(savedZones);

        // Set the listviews' itemssource to the savedzones list.
        zonesList.ItemsSource = savedZones;
    }
}

3 个答案:

答案 0 :(得分:2)

我认为您可以将对象列表序列化为json String并将其保存到Application Properties

答案 1 :(得分:1)

Application Properties仅存储基元类型。

  

注意:属性字典只能序列化基本类型   存储。试图存储其他类型(例如List可以   安静地失败)。   资料来源:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/application-class/

设置它以便将属性用作基本存储,或者转到另一个本地存储机制,例如Sqlite(这是一个很好的指南:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/databases/

答案 2 :(得分:1)

如果使用第三方库不适合您的项目,我强烈建议您使用Akavache。这是一个异步,持久的键值存储。

设置非常简单易用。

//插入对象

IObservable<Unit> InsertObject<T>(string key, T value, DateTimeOffset? absoluteExpiration = null);

//获取您的对象

IObservable<T> GetObject<T>(string key);

其中T可以是您的整个列表。

当然它比这更多但是相信我一点点。阅读完整的文档,希望它符合您的需求。