2010-01-06 5 views
1

J'ai une application ALPHA qui vous permet de récupérer une police obfusquée et un fichier XPS et de stocker le fichier .odttf pour une utilisation dans Silverlight. L'application "fonctionne" comme dans ce qu'elle dit sur la boîte, bien que d'une façon très approximative.Mettre en œuvre le stockage des données entre les appels? (C# - WPF)

En cours de nettoyage de cet outil pour créer le BETA je peux traverser un problème. Je veux que l'application soit présentée dans un style d'assistant qui rassemble les données de l'utilisateur, comme la police à utiliser, où enregistrer le fichier extrait, etc.

Dans la mise en œuvre actuelle tout cela est fait dans le code derrière (En fait, il appelle une classe d'aide). Mais l'implémentation d'un assistant signifie que chaque partie des données est collectée sur une "page" différente. Je ne voulais pas simplement passer les données en utilisant les constructeurs de pages car j'essaie d'implémenter MVVM qui vise à garder le code propre.

Je suppose que ce que je cherche est un stockage de données dans le code qui persiste windows. De cette façon, je peux saisir les données dans ma fenêtre (vue), les passer à mon viewmodel via la liaison et l'envoyer au modèle Windows (classe de données) pour être stocké quelque part.

Je pourrais utiliser une base de données ou un fichier XML, mais cela semble être un stockage trop puissant pour les quelques informations dont j'ai besoin. Donc, en résumé, existe-t-il un moyen d'avoir un objet en mémoire qui persiste dans les appels de fenêtre et peut être référencé par plusieurs modèles (classes).

Merci!

Répondre

0

La meilleure façon serait d'utiliser le même ViewModel pour toutes les pages, puis de le sérialiser si vous voulez l'utiliser plus tard.

public class MyViewModel 
{ 
    // Properties to be serialized 
    public string MyViewModelProperty1 = ""; 
    public string MyViewModelProperty2 = ""; 

    // Save to file. 
    public virtual bool Save(string viewmodelFilePath) 
    { 
     try 
     { 
      Directory.CreateDirectory(Path.GetDirectoryName(viewmodelFilePath)); 
      StreamWriter write = new StreamWriter(viewmodelFilePath); 
      XmlSerializer xml = new XmlSerializer(GetType()); 
      xml.Serialize(write, this); 
      write.Close(); 
     } 
     catch 
     { 
      return false; 
     } 
     return true; 
    } 

    // Load from file. 
    public static object Load(Type type, string viewmodelFilePath) 
    { 
     StreamReader reader; 
     object settings; 
     XmlSerializer xml = new XmlSerializer(type); 

     try 
     { 
      reader = new StreamReader(viewmodelFilePath); 
      viewmodel = xml.Deserialize(reader); 
      reader.Close(); 
     } 
     catch 
     { 
      viewmodel = 
       type.GetConstructor(System.Type.EmptyTypes).Invoke(null); 
     } 
     return viewmodel; 
    } 
} 

Code original de livre Petzold

+0

J'y avais pensé mais ce n'est pas vrai pour le modèle MVVM, si je suis allé de l'avant, je ne peux pas non plus utiliser MVVM. Il doit sûrement y avoir un moyen de créer un objet avant l'ouverture de la première fenêtre accessible aux autres classes de l'implémentation. Merci tout de même pour ta contribution! – deanvmc

+0

Pourquoi dites-vous n'est pas vrai MVVM? MVVM ne vous limite pas à utiliser le même viewModel dans différentes vues ... –

+0

Désolé, c'est faux, mais vu ma compréhension de MVVM, je préférerais avoir 1 vue de modèle par modèle. Je vois ce que vous faites et c'est une bonne suggestion pour les modèles singuliers, merci pour le partage! – deanvmc

2

classe statique ou singleton pour stocker vos données et y accéder à partir de tous vos points de vue?

+0

Est-il possible d'écrire dans une telle classe? – deanvmc

Questions connexes