1

我试过按照Joost Van Schaik's article on tombstoning中的步骤,但无法让它为我工作。我毫无疑问做错了什么。在我的ViewModel:MVVM轻和WP7 ViewModel墓碑不起作用

private string _foobar ="init"; 

public string testStr 
{ 
    get 
    { 
     return _foobar; 
    } 

    set 
    { 
     _foobar = value; 
    } 
} 

而且在我的网页:

<TextBox x:Name="tBoxTest" Text="{Binding testStr, Mode=TwoWay}" /> 

当应用程序运行时,在tBoxTest组改变值_foobar得很好,但尝试序列它,它好像有忘记了实例?任何帮助将不胜感激。

+0

你已经证明了你的财产,这看起来不错的代码,但你有没有实现的解决方案的其余部分实际上在`Activated`和`Deactivated`事件中相应地序列化和反序列化视图模型的实例? – 2011-02-02 08:11:59

+0

是的,我有。我应该在这篇文章中说清楚。我试图把重点放在一个问题上。 – Stonetip 2011-02-02 14:46:27

回答

0

从您发布的代码中找不到即时答案。

我的建议调试是这样的:

  • 如果你从这篇文章复制的代码完全再添加一些东西(一个消息?)为空catch处理 - `赶上(例外){}

  • 使用调试器来把断点在LoadModel和SaveToIsolatedStorage方法

  • 利用这些断点,单步执行加载和保存码 - 是代码正确加载和保存?

说实话,像这样的问题,做一个小调查自己是不是问对的问题在这里要好得多(IMO!)

1

我能得到立碑工作,与具有沿对象是我所有的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); 
     } 
    } 
}