Как я могу сохранить глобальные переменные приложения в WPF?

В WPF, где я могу сохранить значение в одном UserControl, а затем в другом UserControl снова получить доступ к этому значению, что-то вроде состояния сеанса в веб-программировании, например:

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

person Edward Tanguay    schedule 26.05.2009    source источник
comment
Думаю, вы не поняли, что я имел в виду под статическим классом... думаю, в следующий раз мне придется подробнее остановиться на этом.   -  person CSharpAtl    schedule 26.05.2009
comment
Словарь не является потокобезопасным, это не будет жизнеспособным решением, если вы планируете получать доступ к ApplicationState из нескольких потоков.   -  person J. Mitchell    schedule 11.01.2012
comment
@J.Mitchell Он может использовать ConcurrentDictionary   -  person DmitryBoyko    schedule 05.12.2013


Ответы (4)


Что-то вроде этого должно работать.

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];
    }
}
person Bob    schedule 26.05.2009
comment
Где мы собираемся реализовать этот класс? и является ли эта реализация Thread Safe? - person co2f2e; 03.06.2016

Класс Application уже имеет встроенную функциональность.

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

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

person Gulzar Nazim    schedule 26.05.2009

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

person CSharpAtl    schedule 26.05.2009