MVVMLight和数据序列化

问题描述 投票:1回答:2

我正在针对Windows 8应用商店应用MVVMLight。观看一些视频后,我已经掌握了基本知识。但是我遇到了一个问题。我的每个基本模型类都继承自MVVMLight中的ObservableObject。

这很好,但是我现在想将数据加载并保存到XML。因此,我用之前在非MVVM实现中使用的DataContract属性标记了它们。但是,这现在在序列化时会产生错误,因为它说我继承的类也必须使用此属性进行标记。

由于ObservableCollection是在dll中编译的,我该如何管理它?我是否需要创建一组与我的“ ViewModel”样式匹配的基本(POCO样式)类,并处理它们之间的映射。还是有更好的方法?

serialization mvvm-light
2个回答
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类中的事件)时,我们将保存状态对象。

通过执行此操作,我们可以存储视图模型的状态,而不是视图模型本身。因为我们控制序列化服务,所以可以使用我们要使用的任何序列化方法来保存数据。


0
投票

使用Json.Net允许基于GalaSoft.MvvmLight.ObservableObject对类进行序列化和反序列化。如果可以使用此库,那似乎是最简单的解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.