我开始使用MVVMLight来开发Windows 8商店应用。观看了一些视频后,我已经掌握了基本功能。但是我遇到了一个问题。我的每个基础模型类都继承自MVVMLight中的ObservableObject。
这工作正常,但我现在想要加载数据并将数据保存到XML。所以我用DataContract属性标记它们,我之前在非MVVM实现中使用过该属性。但是,这会在序列化时产生错误,因为它表示我的继承类也必须用此属性标记。
由于在dll中编译了ObservableCollection,我该如何管理呢?我是否必须创建一组与我的“ViewModel”样式匹配的基本(POCO样式)类,并处理它们之间的映射。或者有更好的方法吗?
答案 0 :(得分:2)
您不希望序列化您的视图模型,您希望序列化它们的当前状态,以便在重新启动应用程序时它们可以自行重建。
所以,像这样:
public class ViewModelFoo
{
public ViewModelFoo(ISerializationService serializationService)
{
_serializationService=serializationService;
LoadDefaultData();
}
private void LoadDefaultData()
{
//Do all your loading of static data here
FooItems=GetFooItems();
if(_serializationService.ContainsSerializedState)
{
LoadSerializedState();
}
}
public Observable<Foo> FooItems{get;set;}
public Foo SelectedFooItem
{
get{return _fooItem;}
set{_fooItem=value;
RaisePropertyChanged("SelectedFooItem");
_serializationService.SelecetedFooItem=value;
}
}
private void LoadSerializedData()
{
SelectedFooItem=_serializationService.SelectedFooItem;
ReloadData();
}
private void ReloadData()
{
//load whatever data you need. You've now got your app back into the state it was when it was serialized;
}
}
基本上,每次我们在屏幕上更改内容时,我们都会更新状态对象。当我们暂停app(App类中的事件)时,我们会保存状态对象。
通过这样做,我们能够存储viewmodel的状态而不是viewmodel本身。因为我们控制序列化服务,所以我们可以使用我们想要使用的任何序列化方法来保存数据。
答案 1 :(得分:0)
使用Json.Net可以基于GalaSoft.MvvmLight.ObservableObject
对类进行序列化和反序列化。如果可以使用此库,那似乎是最简单的解决方案。