2017-05-31 5 views
1

私がしたいことは、ユーザーがリストに項目を追加させることです。その後、アイテムを追加するときに、保存するリストが必要なので、ユーザーがアプリケーションを閉じてもう一度開くと、作成したリストはそのまま残ります。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; 
     } 
    } 

これは私が今使用しているコードですが、これを保存することはできますが動作しません。

EDIT:だから私は@Alessandro Calarioが提案し、JSONシリアライズを使用した後、リストビューは、ちょうど(私は一つだけを追加していても)私の空のリスト項目のトンを与えるもの試みました。しかし、アイテムが追加され、アプリケーションが閉じられても保存されます。進歩は、少なくとも、私はまだかなりです。誰でも解決策を知っていますか?

私のコード:

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

答えて

1

サードパーティのライブラリを使用している場合は、あなたのプロジェクトにとっては重要ではありません。Akavacheを使用することを強くお勧めします。これは、非同期の永続的なキー値ストアです。

設定が非常に簡単です。あなたのオブジェクトTはあなたの全体のリストを指定でき

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

を得るためにあなたのオブジェクト

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

//を挿入するために

//。

もちろんこれよりも少しですが、私をちょっと信頼してください。完全なドキュメントを読んで、あなたのニーズに合ったものであることを願ってください。

+0

これは私のための最適な選択肢だと思われますが、私はそれを試して、私のアプリはリストを保存しますが、それをもう一度開いて別の項目を追加すると、現在のリストを上書きして1つの項目を追加します。私はそれがまだ私のアプリが開始されるたびにリストの新しいインスタンスを作成するためだと思う。そのため、古いものは、アプリの起動時にリストビューのアイテムソースとして設定されています。それを回避する方法はありますか? –

+0

あなたはキャッシングの内容を読むことができます。利用可能なものがあれば、読み込んで保存したリストを変更して保存し直します。 – apineda

+0

これは、 'var _zonesList = BlobCache.LocalMachine.GetObject >(" zones ");を待ってから、zonesListに項目を追加してもう一度保存するような意味ですか?それは動作しないので。私はzonesListに何かを追加しようとするとNullReferenceExceptionが発生します。なぜこれが起こっているのか分かりません。 –

1

アプリケーションのプロパティのみ保存するプリミティブ型。

注:プロパティ辞書では、 のストレージのプリミティブタイプのみをシリアル化できます。他のタイプを保存しようとしています(例えば、リストは が黙って失敗する可能性があります)。 出典:https://developer.xamarin.com/guides/xamarin-forms/application-fundamentals/application-class/

どちらかがそうあなたは原始的なストレージとしての性質を利用し、または、そのようなSqliteを(ここでは良いガイド:​​)などの別のローカル・ストレージ・メカニズムのために行くされていることを設定

+0

プリミティブストレージとしてプロパティを使用して設定しようとしましたが、別の問題が発生しました。私の編集を見ていただけますか?私は今質問に追加しました。 –

2

私はあなたを考えますオブジェクトリストをjson Stringにシリアル化してアプリケーションプロパティに保存することができます

+0

はい、私はこれを行うことを検討していました。私は今それをやろうとします。 –

+0

申し訳ありませんが、これを試して保存しましたが、1つのアイテムを追加した後、空のリストアイテムがリストビューに表示されます。私は質問で使用したコードを追加します。あなたは見てみることができますか? –

+0

savedZonesは文字列です。オブジェクトにデシリアライズする必要があります... Account account = JsonConvert.DeserializeObject (json);デシリアライゼーションは何もしていません。あなたのItemsSourceオブジェクトに渡してください(あなたは文字列を渡しています...) –

関連する問題