繁体   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