2009-05-26 19 views
9

En WPF, ¿dónde puedo guardar un valor cuando en un control de usuario, y más tarde en otro control de usuario acceso que valoran de nuevo, algo así como el estado de sesión en la programación web, por ejemplo:¿Cómo puedo guardar las variables globales de la aplicación en 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 

RESPUESTA:

Gracias, Bob, aquí está el código que llegué al trabajo, basado en la suya:

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); 
     } 
    } 
} 

Para guardar una variable:

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

para leer una variable :

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

Supongo que no entendía lo que quería decir por clase estática ... supongo que tendrá que elaborar más la próxima vez. – CSharpAtl

+0

El diccionario no es seguro para subprocesos, esta no sería una solución viable si planea acceder a ApplicationState desde múltiples subprocesos. –

+0

@ J.Mitchell Puede usar ConcurrentDictionary –

Respuesta

9

Algo como esto debería funcionar.

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

¿Dónde implementaremos esta clase? y esta implementación es Thread Safe? – Kalanamith

0

Podría almacenarlo usted mismo en una clase estática o repositorio que puede inyectar a las clases que necesitan los datos.

2

Puede exponer una variable estática pública en el expediente App.xaml.cs y luego acceder a ella en cualquier lugar utilizando la clase App ..

12

The Application class ya tiene esta funcionalidad incorporada.

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