簡體   English   中英

如何在應用暫停和啟動時保存和加載可觀察的集合?

[英]How to save and load an observablecollection on app suspend and start?

我試圖弄清楚在關閉或暫停應用程序時如何保存可觀察的收藏項目,然后在再次打開應用程序時重新加載它們。 這就是我所擁有的,但是因為方法是靜態的,並且正在從App.xaml.cs文件中調用,所以MemoryItems observablecollection需要引用。 因此,我不太了解如何保存和更新可觀察的集合。 我試圖在App.xaml.cs文件中使用ViewModel的實例,但隨后在MemoryItems observablecollection中獲得了零項。

public ObservableCollection<MemoryItem> MemoryItems { get; set; } = new ObservableCollection<MemoryItem>();

public MainPageViewModel()
{           
}

public string MemoryValue
{
   get
   {
       return _memoryValue;
   }
   set
   {
       _memoryValue = value;
       OnPropertyChanged("MemoryValue");
   }
}


public static async Task Serializer()
{
    var folder = ApplicationData.Current.RoamingFolder;
    var file = await folder.CreateFileAsync("collection.json", CreationCollisionOption.ReplaceExisting);
    using (var stream = await file.OpenStreamForWriteAsync())
    using (var writer = new StreamWriter(stream, Encoding.UTF8))
    {
        string json = JsonConvert.SerializeObject(MemoryItems);                
        await writer.WriteAsync(json);
    }
}

public static async Task Deserializer()
{
    try
    {
        var folder = ApplicationData.Current.RoamingFolder;
        var file = await folder.GetFileAsync("collection.json");
        using (var stream = await file.OpenStreamForReadAsync())
        using (var reader = new StreamReader(stream, Encoding.UTF8))
        {
            string json = await reader.ReadToEndAsync();                    
            MemoryItems = JsonConvert.DeserializeObject<ObservableCollection<MemoryItem>>(json);
        }               
    }
    catch (Exception)
    {
        // Handle Exception.
    }
}

然后在App.xaml.cs文件中

public async void OnSuspending(object sender, SuspendingEventArgs args)
{
    SuspendingDeferral deferral = args.SuspendingOperation.GetDeferral();

    await MainPageViewModel.Serializer();

    deferral.Complete();
 }

public override async Task OnStartAsync(StartKind startKind, IActivatedEventArgs args)
{
    NavigationService.Navigate(typeof(Views.MainPage));

    await MainPageViewModel.Deserializer();

    await Task.CompletedTask;

 }

我的解決方案是使用To和From OnNavigatedAsync方法刪除靜態關鍵字並處理viewmodel中的所有內容。 我預計應用程序每次啟動時都不會還原很多數據,而且這種方法正在起作用,因此盡管它可能很微不足道,但它可以完成工作。

        private bool newPage = true;

        public override async Task OnNavigatedFromAsync(IDictionary<string, object> suspensionState, bool suspending)
    {
        await Serializer();
    }

    public override async Task OnNavigatedToAsync(object parameter, NavigationMode mode, IDictionary<string, object> state)
    {
        if (newPage == true) 
        {
            await Deserializer();
            newPage = false;
        }
    }


public async Task Serializer()
    {
        var folder = ApplicationData.Current.RoamingFolder;
        var file = await folder.CreateFileAsync("collection.json", CreationCollisionOption.ReplaceExisting);
        using (var stream = await file.OpenStreamForWriteAsync())
        using (var writer = new StreamWriter(stream, Encoding.UTF8))
        {
            string json = JsonConvert.SerializeObject(MemoryItems);
            await writer.WriteAsync(json);
        }
    }
    public async Task Deserializer()
    {
        try
        {
            var folder = ApplicationData.Current.RoamingFolder;
            var file = await folder.GetFileAsync("collection.json");
            using (var stream = await file.OpenStreamForReadAsync())
            using (var reader = new StreamReader(stream, Encoding.UTF8))
            {
                var json = await reader.ReadToEndAsync();
                ObservableCollection<MemoryItem> MemoryItems = JsonConvert.DeserializeObject<ObservableCollection<MemoryItem>>(json);

                if(MemoryItems.Count != 0)
                {
                    foreach (var item in MemoryItems)
                    {
                        var sb = new StringBuilder();
                        sb.Append(item.Memory);
                        var fileString = sb.ToString();

                        var memoryItem = new MemoryItem
                        {
                            Memory = fileString
                        };
                        this.MemoryItems.Add(memoryItem);
                    }
                }
                else
                {
                    Memory();
                } 
            }
        }
        catch (Exception)
        {
            // Handle Exception.
        }
    }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM