我能得到立碑工作,与具有沿对象是我所有的ViewModels可见,通过执行以下操作:
在模型类,我说:
private static Model1 _instance;
public static Model1 Instance
{
get { return _instance; }
set { _instance = value; }
}
public static void CreateNew()
{
if (_instance == null)
{
_instance = new Model1();
_instance.FirstString = "init";
}
}
然后在ApplicationExtensions.cs我说:
public static void SaveToIsolatedStorage(this Application app, Model1 model)
{
var dataFileName = GetIsFile((model.GetType()));
using (var userAppStore =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (userAppStore.FileExists(dataFileName))
{
userAppStore.DeleteFile(dataFileName);
}
using (var iss = userAppStore.CreateFile(dataFileName))
{
SilverlightSerializer.Serialize(model, iss);
}
}
}
而在App.xaml.cs我改变LoadModel()来:
private void LoadModel()
{
try
{
Model1.Instance = this.RetrieveFromIsolatedStorage<Model1>();
}
catch (Exception) { }
if (Model1.Instance == null) Model1.CreateNew();
}
这一切都像这样的工作,我的ViewModel文件所做的事情:
public string TestStr
{
get
{
return Model1.Instance.FirstString;
}
set
{
Model1.Instance.FirstString = value;
}
}
而且通过,我的意思是模型1的对象被序列化,墓碑是工作 - 至少我得到了我想我想要的东西。我已经通过在应用程序,手机设置之间导航,关闭和打开手机,锁定并在另一部手机的应用程序中调用它进行了很多测试。反序列化的性能很好。我可以和增值税一起工作。
这就是说,先生。凡查克回答的请求提供援助:“如果你是从MVVMLight ViewModelBase它的子类,然后你应该从你的setter这样叫RaisePropertyChanged:
私人字符串_foobar =”初始化“;
公共字符串TestStr { 得到 { 回报_foobar; }
set
{
RaisePropertyChanged("TestStr");
_foobar = value;
}
}
RaisePropert yChanged通知任何监听视图(即你绑定的TextBox)属性发生了变化,应该更新它们的内容。这是一个关键的机制“。
因此,我将与我原本想,但是添加RaisePropertyChanged的工作,一看就知道做什么。
UPDATE
虽然我实现RaisedPropertyChanged(使用代码片段mvvminpc)在我的MainViewModel.cs文件中,对ViewModel中创建的任何内容进行序列化仍然没有任何效果(与其他内容一样好)。我可能仍然在做错误,但它也可能是因为视图模型继承了受保护的类(answer from Laurent Bugnion)。我(非常不情愿) Antly)尝试将该类从受保护的类更改为公共类并重新编译,但对我而言并没有帮助,我讨厌像这样分叉引用的库。无论如何,我现在只是在App.xaml.cs中创建Model1实例。似乎工作。当我在这,我修改的范·查克的方法之一接受任何类型的对象:
public static void SaveToIsolatedStorage<T>(this Application app, T obj)
where T : class
{
var dataFileName = GetIsFile(typeof(T));
using (var userAppStore =
IsolatedStorageFile.GetUserStoreForApplication())
{
if (userAppStore.FileExists(dataFileName))
{
userAppStore.DeleteFile(dataFileName);
}
using (var iss = userAppStore.CreateFile(dataFileName))
{
SilverlightSerializer.Serialize(obj, iss);
}
}
}
你已经证明了你的财产,这看起来不错的代码,但你有没有实现的解决方案的其余部分实际上在`Activated`和`Deactivated`事件中相应地序列化和反序列化视图模型的实例? – 2011-02-02 08:11:59
是的,我有。我应该在这篇文章中说清楚。我试图把重点放在一个问题上。 – Stonetip 2011-02-02 14:46:27