Мне удалось заставить работать захоронение, а также сделать объект видимым для всех моих ViewModels, выполнив следующие действия:
В классе Model я добавил:
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;
}
}
Под этим я подразумеваю, что объект Model1 сериализуется, а захоронение работает — по крайней мере, я получаю то, что, как я думаю, хочу. Я много раз проверял это, перемещаясь между приложениями, настройками телефона, включая и выключая телефон, блокируя его и вызывая его, находясь в приложении с другого телефона. Производительность при десериализации отличная. И я могу работать с варами.
Тем не менее, г-н Ван Шайк ответил на просьбу о помощи следующим образом: "Если вы создаете подклассы из MVVMLight ViewModelBase, это так, и тогда вам следует вызвать RaisePropertyChanged из вашего установщика следующим образом:
частная строка _foobar ="init";
публичная строка TestStr {получить {return _foobar; }
set
{
RaisePropertyChanged("TestStr");
_foobar = value;
}
}
RaisePropertyChanged уведомляет все представления прослушивания (т. е. связанное с ним текстовое поле) об изменении свойства и необходимости обновления их содержимого. Это важнейший механизм."
Так что я буду работать с тем, что я изначально пытался, но с добавлением RaisePropertyChanged, чтобы увидеть, что это делает.
ОБНОВЛЕНИЕ
Хотя я реализовал RaisedPropertyChanged (используя фрагмент кода mvvminpc) в моем файле MainViewModel.cs, это все равно не оказало никакого влияния (насколько это может быть полезно для других вещей) на сериализацию всего, что создано в ViewModel. Вероятно, я все еще делаю что-то не так, но это также может быть связано с тем, что модели просмотра наследуются от защищенного класса (ответ от Лорана Бюньона). Я (очень неохотно) попытался изменить этот класс с защищенного на общедоступный и перекомпилировать, но в моем случае это не помогло, и я ненавижу разветвлять такую библиотеку, на которую ссылаются. В любом случае, пока я просто продвигаюсь вперед с созданием экземпляра Model1 в App.xaml.cs. Кажется, работает. Пока я занимался этим, я модифицировал один из методов Ван Шайка, чтобы он принимал объекты любого типа:
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);
}
}
}
person
Stonetip
schedule
02.02.2011
Activated
иDeactivated
? - person Derek Lakin   schedule 02.02.2011