如何从IsolatedStorage保存并获取ObservableCollection

时间:2014-04-12 01:39:19

标签: c# windows-phone-8 isolatedstorage

我正在填充自定义类类型的ObservableCollection。我需要在应用程序关闭时保存此集合,并在导航到主应用程序页面时重新加载它。我不确定最好的过程。

MainPage.xaml.cs中

public ObservableCollection<History> Items { get; set; }

public MainPage()
    {
        InitializeComponent();

        Items = new ObservableCollection<History>();
        HistoryListBox.ItemsSource = Items; //HistoryListBox displays the Items
    }

protected override void OnNavigatedTo(NavigationEventArgs e)
    {
        ... populate HistoryListBox from Saved data? ....
    }

private async void RunPerformanceTestButton_Click(object sender, RoutedEventArgs e)
    {
        ... run some processes ...

        PopulateHistoryListBox();
    }

private void PopulateHistoryListBox()
    {
        Items.Add(new History { ConnectionType = ConnectionTypeResultTextBlock.Text, DateTime = DateTime.Now, ConnectionLatency = NetworkLatencyResultTextBlock.Text, ConnectionSpeed = NetworkSpeedResultTextBlock.Text });
    }

History.cs

public string ConnectionType
    {
        get;
        set;
    }

    public DateTime DateTime
    {
        get;
        set;
    }

    public string ConnectionSpeed
    {
        get;
        set;
    }

    public string ConnectionLatency
    {
        get;
        set;
    }

那么将ObservableCollection保存到IsolatedStorage然后检索它的最佳方法是什么?

1 个答案:

答案 0 :(得分:0)

我建议接受MVVM。创建一个View Model类并将Items移到那里。然后将Items属性绑定到XAML中的ListBox

通常状态会加载到Page的{​​{1}}事件句柄中并保存在Loaded事件中。但是,根据应用在页面之间导航的方式,您可能希望在Unloaded中加载状态并在OnNavigatedTo中保存状态。加载通常会创建视图模型并从隔离存储加载它,并且保存会将其状态保存到独立存储。例如:

OnNavigatedFrom

当然,这假设您已将Json.NET包添加到项目中。

为了帮助设计,您可以在XAML中创建视图模型(因此您可以在设计中绑定某些内容)。例如:

private MainViewModel MainViewModel;
protected override async void OnNavigatedTo(NavigationEventArgs e)
{
    MainViewModel = new MainViewModel();
    using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
    {
        try
        {
            if (iso.FileExists("AppState.date"))
            {
                using (var stream = iso.OpenFile("AppState.dat", FileMode.Append, FileAccess.Write))
                {
                    string text;
                    using (var reader = new StreamReader(stream))
                    {
                        text = await reader.ReadToEndAsync();
                    }
                    var history = JsonConvert.DeserializeObject<List<History>>(text);
                    MainViewModel.Items = history;
                }
            }
        }
        catch (IOException)
        {
            // TODO: log
        }
    }
}

protected override async void OnNavigatedFrom(NavigationEventArgs e)
{
    using (var iso = IsolatedStorageFile.GetUserStoreForApplication())
    {
        try
        {
            using (var stream = iso.OpenFile("AppState.dat", FileMode.Create, FileAccess.Write))
            {
                Debug.WriteLine(stream.Length);
                using (var writer = new StreamWriter(stream))
                {
                    await writer.WriteLineAsync(JsonConvert.SerializeObject(MainViewModel.Items));
                }
            }
        }
        catch (IOException)
        {
            // TODO: log
        }
    }
}

在MainViewModel的构造函数中,如有必要,构造调试状态。

然后,您可以将视图模型初始化为&#34; debug&#34;以外的其他内容。 <phone:PhoneApplicationPage.DataContext> <viewModels:MainViewModel/> </phone:PhoneApplicationPage.DataContext> 事件处理程序或Loaded中的状态,例如:

OnNavigatedTo