none
Хранение данных в приложении RRS feed

  • Вопрос

  • Добрый день! Подскажите, пожалуйста. Работаю в C#. У меня многостраничное приложение. Необходимо, чтобы были заданы переменные, доступные на всех страницах. Как это сделать? Заранее благодарю за ответ.
    10 июня 2017 г. 18:03

Ответы

  • Использование статической переменной не рекомендуется.

    Так правильно: internal static bool bLoadPage = true;

    Если нет то почему и как лучше?

    Плохо то, что данная реализация сделана в предположении существования единственного экземпляра страницы, что делает приложение немасштабируемым. Допустим, страница отображает некий документ. Если вам впоследствии захочется добавить возможность открывать несколько документов одновременно, большую часть кода придется переписывать.

    Нужно не пихать статические переменные в страницу напрямую, а пользоваться понятием "контекста". Создаем класс  AppContext, пихаем в него все переменные, относящиеся к состоянию приложения, и добавляем статическое свойство Current. Соответственно, из кода обращаемся как AppContext.Current.bLoadPage. Когда захочется сделать несколько одновременных страниц, делаем в AppContext коллекцию контекстов, и меняем свойство Current, чтобы он возвращал активный в данный момент контекст. Основную часть кода переписывать не придется.

    11 июня 2017 г. 10:38

Все ответы

  • Что такое "многостраничное приложение"? Ответ меняется в зависимости от типа приложения.

    Но в общем случае просто добавьте нужные "переменные" в класс (считая что ваши "страницы" являются классами) и при создании класса установите их значение, например в конструкторе.

    Использование статической переменной не рекомендуется.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    10 июня 2017 г. 18:37
    Модератор
  • То есть создал приложение uwp. Там создается одна страница MainPage. Я создал еще несколько элементов, страниц такого же типа.
    10 июня 2017 г. 18:40
  • Использование статической переменной не рекомендуется.

    Так правильно: internal static bool bLoadPage = true;

    Если нет то почему и как лучше?

    10 июня 2017 г. 19:00
  • Использование статической переменной не рекомендуется.

    Так правильно: internal static bool bLoadPage = true;

    Если нет то почему и как лучше?

    Это восходит к так называемому "singleton pattern" где имеется один экземпляр класса, типично св статической переменной. Этот метод имеет серьезные проблемы, например читайте тут:

    https://blogs.msdn.microsoft.com/scottdensmore/2004/05/25/why-singletons-are-evil/



    This posting is provided "AS IS" with no warranties, and confers no rights.

    10 июня 2017 г. 20:53
    Модератор
  • То есть создал приложение uwp. Там создается одна страница MainPage. Я создал еще несколько элементов, страниц такого же типа.

    Ну в этом случае все просто, см. описание выше. Если используется MVVM (что почти обязательно) то все эти "страницы" могут иметь общую модель или же общие данные на VM.

    https://msdn.microsoft.com/en-us/library/hh848246.aspx

    Если бы речь шла о web приложении, то потребовались бы более интересные методы.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    10 июня 2017 г. 21:00
    Модератор
  • Этот метод имеет серьезные проблемы, например читайте тут:
    https://blogs.msdn.microsoft.com/scottdensmore/2004/05/25/why-singletons-are-evil/

    https://msdn.microsoft.com/en-us/library/hh848246.aspx


    А для тех кому en-us недоступен в понимании, есть что-нибудь на ru-ru почитать?
    Как правильно в MVVM организовать такую переменную с какими атрибутами видимости и доступности?
    11 июня 2017 г. 5:33
  • Про книги не знаю, а Яндекс возвращает кое-что полезное по запросу MVVM.

    Это несущественные детали которые не влияют на подход. Обычно для этого используется уже имеющийся свойство DataContext. Можно просто создать объект в конструкторе или передать его из диспетчера "страниц" или можно использовать Dependency injection, вариантов много.


    This posting is provided "AS IS" with no warranties, and confers no rights.

    11 июня 2017 г. 6:50
    Модератор
  • Использование статической переменной не рекомендуется.

    Так правильно: internal static bool bLoadPage = true;

    Если нет то почему и как лучше?

    Плохо то, что данная реализация сделана в предположении существования единственного экземпляра страницы, что делает приложение немасштабируемым. Допустим, страница отображает некий документ. Если вам впоследствии захочется добавить возможность открывать несколько документов одновременно, большую часть кода придется переписывать.

    Нужно не пихать статические переменные в страницу напрямую, а пользоваться понятием "контекста". Создаем класс  AppContext, пихаем в него все переменные, относящиеся к состоянию приложения, и добавляем статическое свойство Current. Соответственно, из кода обращаемся как AppContext.Current.bLoadPage. Когда захочется сделать несколько одновременных страниц, делаем в AppContext коллекцию контекстов, и меняем свойство Current, чтобы он возвращал активный в данный момент контекст. Основную часть кода переписывать не придется.

    11 июня 2017 г. 10:38