2009-05-26 3 views
9

В WPF, где я могу сохранить значение, когда в одном из UserControl, а потом в другой доступ UserControl , что ценность снова, что-то вроде состояния сеанса в веб-программировании, например:Как сохранить глобальные переменные приложения в 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 

ОТВЕТ:

Спасибо, Боб, вот код, который я должен работать, основываясь на вашем:

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

Чтобы сохранить переменную:

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

Чтобы прочитать переменную :

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

Думает, вы не поняли, что я имел в виду статического класса ... думаю, мне придется разработать следующий раз. – CSharpAtl

+0

Словарь не является потокобезопасным, это не будет жизнеспособным решением, если вы планируете получить доступ к ApplicationState из нескольких потоков. –

+0

@ J.Mitchell Он может использовать ConcurrentDictionary –

ответ

9

Что-то, как это должно работать.

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

Где мы собираемся реализовать этот класс? и является ли это реализацией Thread Safe? – Kalanamith

0

Возможно, просто сохраните его самостоятельно в статическом классе или репозиторий, который вы можете вводить в классы, которым нужны данные.

2

Вы можете выставить публичную статическую переменную в App.xaml.cs файл, а затем получить доступ к нему в любом месте, используя класс App ..

12

The Application class уже есть эта функциональность встроена.

// Set an application-scope resource 
Application.Current.Resources["ApplicationScopeResource"] = Brushes.White; 
... 
// Get an application-scope resource 
Brush whiteBrush = (Brush)Application.Current.Resources["ApplicationScopeResource"]; 
Смежные вопросы