2009-05-26 11 views
9

Dans WPF, où puis-je enregistrer une valeur quand dans un UserControl, puis plus tard dans un autre accès UserControl qui valorisent à nouveau, quelque chose comme l'état de session dans la programmation web, par exemple:Comment sauvegarder les variables d'application globales dans WPF?

UserControl1.xaml.cs :

Customer customer = new Customer(12334); 
ApplicationState.SetValue("currentCustomer", customer); //PSEUDO-CODE 

UserControl2.xaml.cs:

Customer customer = ApplicationState.GetValue("currentCustomer") as Customer; //PSEUDO-CODE 

RÉPONSE:

Merci, Bob, voici le code que je suis arrivé au travail, basé sur le vôtre:

public static class ApplicationState 
{ 
    private static Dictionary<string, object> _values = 
       new Dictionary<string, object>(); 
    public static void SetValue(string key, object value) 
    { 
     if (_values.ContainsKey(key)) 
     { 
      _values.Remove(key); 
     } 
     _values.Add(key, value); 
    } 
    public static T GetValue<T>(string key) 
    { 
     if (_values.ContainsKey(key)) 
     { 
      return (T)_values[key]; 
     } 
     else 
     { 
      return default(T); 
     } 
    } 
} 

Pour enregistrer une variable:

ApplicationState.SetValue("currentCustomerName", "Jim Smith"); 

Pour lire une variable :

MainText.Text = ApplicationState.GetValue<string>("currentCustomerName"); 
+0

Je suppose que tu ne comprenais pas ce que je voulais dire par classe statique ... suppose que je vais devoir élaborer plus la prochaine fois. – CSharpAtl

+0

Le dictionnaire n'est pas compatible avec les threads, cela ne serait pas une solution viable si vous envisagez d'accéder à ApplicationState à partir de plusieurs threads. –

+0

@ J.Mitchell Il peut utiliser ConcurrentDictionary –

Répondre

9

Quelque chose comme cela devrait fonctionner.

public static class ApplicationState 
{ 
    private static Dictionary<string, object> _values = 
       new Dictionary<string, object>(); 

    public static void SetValue(string key, object value) 
    { 
     _values.Add(key, value); 
    } 

    public static T GetValue<T>(string key) 
    { 
     return (T)_values[key]; 
    } 
} 
+0

Où allons-nous implémenter cette classe? et cette implémentation Thread Safe est-elle? – Kalanamith

0

Pourrait juste le stocker vous-même dans une classe statique ou référentiel que vous pouvez injecter dans les classes qui ont besoin des données.

2

Vous pouvez exposer une variable statique publique dans le fichier App.xaml.cs et y accéder n'importe où en utilisant la classe App ..

12

The Application class a déjà cette fonctionnalité intégrée.

// Set an application-scope resource 
Application.Current.Resources["ApplicationScopeResource"] = Brushes.White; 
... 
// Get an application-scope resource 
Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"]; 
Questions connexes