Где лучше всего хранить глобальную информацию в приложении WPF? - PullRequest
1 голос
/ 20 февраля 2009

Я бывший разработчик PHP, сейчас работаю с приложениями WPF / C #, и у меня возникают проблемы с пониманием лучшего способа доступа к глобальным переменным и того, как UserControls обращается к главному окну и т. Д.

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

public Window1()
{
    InitializeComponent();

    List<string> userControlKeys = new List<string>();
    userControlKeys.Add("Welcome");
    userControlKeys.Add("News");
    Type type = this.GetType();
    Assembly assembly = type.Assembly;
    foreach (string userControlKey in userControlKeys)
    {
        string userControlFullName = String.Format("{0}.Pages.{1}", type.Namespace, userControlKey);
        UserControl userControl = (UserControl)assembly.CreateInstance(userControlFullName);
        _userControls.Add(userControlKey, userControl);
    }

    //set the default page
    btnWelcome.RaiseEvent(new RoutedEventArgs(Button.ClickEvent));
}

Вопрос : из UserControl как я могу получить доступ к своему словарю в Window1?

  • Я могу получить доступ к статическому классу Window1, но не к его экземпляру, поэтому создание Getter для него больше не дает мне.
  • в C # есть глобальные атрибуты, но я могу представить, что есть лучший, более удобный способ ООП
  • просто мне кажется, что я смотрю на это с точки зрения переменных веб-сайта / сеанса и, таким образом, упускаю ключевую концепцию разработки рабочего стола, где "состояние везде"

Надеюсь, кто-то может пролить свет на это.

Ответы [ 4 ]

2 голосов
/ 20 февраля 2009

Попробуйте использовать объект singleton . Идея состоит в том, чтобы использовать механику статических объектов для достижения «глобальных» переменных, но которые содержатся в объекте управления безопасностью.

1 голос
/ 20 февраля 2009

У вас есть несколько вариантов:

  1. Объект настроек .Net. Это приносит с собой дополнительные функции, такие как сериализация. Имеет смысл, если это какая-то настройка приложения, к которой у вашего приложения тоже должен быть доступ.
  2. Вы можете сохранить в коллекции ресурсов Window1. Затем используйте FindResource (...) в UserControl, чтобы найти объект. Это делает так, чтобы словарь был доступен для всех элементов в поддереве Window1.
  3. Вы можете использовать свойство Tag UserControl. Я бы не рекомендовал это.
0 голосов
/ 07 мая 2009

Как только вы действительно разберетесь в аспектах связывания данных в WPF, элементу управления (почти) никогда не потребуется доступ к своему родительскому элементу в коде. Преобразователи привязки данных плюс очень мощные. Я рассматриваю обработчики событий управления как абсолютное последнее средство.

Я думаю, что вы правы; PHP это совсем другой мир. Я использовал шаблон MVVM для своего WPF и других приложений .Net. Посмотрите на эту статью о шаблоне MVVM, и вы можете получить некоторые новые идеи: http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

0 голосов
/ 20 февраля 2009

Я не знаю, как это работает в WPF, но в WinForms каждый элемент управления имеет метод FindForm , который возвращает ссылку на родительскую форму. Я полагаю, что в WPF есть нечто похожее, хотя я все еще ищу его.

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