2013-03-18 62 views
1

我有ViewModel与2 ObservableCollection,当我的应用程序关闭时,我序列化我的ViewModel。Serialize ViewModel,ObservableCollection

我的代码:

private void Application_Closing(object sender, ClosingEventArgs e) 
    { 
     using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
     { 
      using (var stream = new IsolatedStorageFileStream("data.txt", FileMode.Create, FileAccess.Write, store)) 
      { 
       var serializer = new XmlSerializer(typeof(AppViewModel.NewsViewModel)); 
       serializer.Serialize(stream, ViewModel); 
      } 
     } 
    } 

AppViewModel.NewsViewModel包含

public ObservableCollection<NewsItemViewModel> EpsItems 
      { 
       get { return _epsItems; } 
      } 


      public ObservableCollection<NewsItemViewModel> OthItems 
      { 
       get { return _othItems; } 
      } 

和方法,通过该填充集合。

NewsItemViewModel:

public class NewsItemViewModel 
     { 
      public NewsItemViewModel() 
      { 
      } 

      public int Id { get; set; } 
      public DateTime Date { get; set; } 
      public string Title { get; set; } 
      public string Text { get; set; } 
      public string FullText { get; set; } 
      public string ImageUrl { get; set; } 
      public string NewsUrl { get; set; } 
     } 

一切工作正常,但我不明白如何利用,例如,六个记录采取每个集合,之后进行序列化的视图模型......我怎样才能做到这一点?例如,如果EpsItems和OthItems包含20个条目。

在此先感谢。很遗憾我的英语不好^^

UPD:下面是一个例子,我将介绍我想要的东西,但不知道怎么... 例如:用户下载了30项用于EpsItems和25 OthItems的条目,当他关闭应用程序viewmodel序列化。我分别保存了30个和25个条目。我想要保存更少的条目集合比用户下载...例如,每个集合的10条记录。问题:我如何做这个实现?请执行和代码帮助...

+0

你也可以说再现问题一个完整的例子? – 2013-03-18 18:24:31

+0

@MattLacey发布了 – 2013-03-18 19:02:31

+0

为什么要序列化viewmodel?你能否详细解释一下实际问题是什么。对你底部的解释是对我的误导。 – 2013-03-18 19:06:05

回答

2

看起来很容易实现:

  1. 创建一个名为例如方法ClearUnnecessaryData在你的ViewModel班,并在那里进行清洁。

  2. 在序列化之前调用该方法。

方法应该看起来像:

for(int i = MAX_SERIALIZATION_ITEMS; i < EpsItems.Count;) 
{ 
    EpsItems.RemoveAt(MAX_SERIALIZATION_ITEMS); 
} 

for(int i = MAX_SERIALIZATION_ITEMS; i < OthItems.Count;) 
{ 
    OthItems.RemoveAt(MAX_SERIALIZATION_ITEMS); 
} 

而且你ApplicationClosing事件处理程序应该是:

private void Application_Closing(object sender, ClosingEventArgs e) 
{ 
    ViewModel.ClearUnnecessaryData(); 

    using (var store = IsolatedStorageFile.GetUserStoreForApplication()) 
    { 
     using (var stream = new IsolatedStorageFileStream("data.txt", FileMode.Create, FileAccess.Write, store)) 
     { 
      var serializer = new XmlSerializer(typeof(AppViewModel.NewsViewModel)); 
      serializer.Serialize(stream, ViewModel); 
     } 
    } 
} 
+0

谢谢,这是个好主意=)但为了一切工作正常,我必须删除i ++。) – 2013-03-19 10:02:28

+0

你是对的!更新了我的答案。 – MarcinJuraszek 2013-03-19 10:07:15