Глобальные переменные в MVVM - PullRequest
0 голосов
/ 28 апреля 2018

У меня есть многостраничное MVVM приложение, в котором есть несколько ViewModels. (Это хобби-приложение, хранящее статистику и прочее)

Следующие классы

  • GamePageViewModel
  • MenuViewModel
  • PlayersViewModel
  • StartPagePresenter
  • Controller (действует как PageSwitcher и как модель, в которой хранятся все мои TableAdapters из базы данных)

Все они имеют несколько одинаковых переменных

  • Universe
  • Character
  • Season

То, что я хотел бы сделать, это переместить эти переменные в мой MainMenuViewModel (который является меню на всех страницах), где вы выбираете Universe, Character, Season и т. Д., И они заполняются в других ViewModels.

мой MenuViewModel класс

    public class MenuViewModel : ObservableObject
    {

        private DataView _Universes = Controller.UniverseTableAdapter.GetData().DefaultView;
        private DataRowView _SelectedUniverse;

        public DataView Universes
        {
            get { return _Universes; }
            set
            {
                _Universes = value;
                RaisePropertyChangedEvent("Universes");
            }
        }

        public DataRowView SelectedUniverse
        {
            get { return _SelectedUniverse; }
            set
            {
                _SelectedUniverse = value;
                Controller.SelectedUniverse = _SelectedUniverse;
                RaisePropertyChangedEvent("SelectedUniverse");
            }
        }

        public ICommand GoHome { get { return new DelegateCommand(NavigateHome); } }

        public ICommand GoPlayers { get { return new DelegateCommand(NavigatePlayers); } }

        public ICommand GoGame { get { return new DelegateCommand(NavigateGame); } }


        public void NavigateHome() { Controller.Switch(new StartPage()); }

        public void NavigatePlayers() { Controller.Switch(new PlayerPage()); }

        public void NavigateGame() { Controller.Switch(new GamePage()); }

    }

Я думал, что попытаюсь сохранить их в Controller классе, как это, но не уверен, как я буду отправлять RaisePropertyChangedEvent События в каждую из ViewModels

    public static class Controller
    {

        #region Variables

        //Variables
        private static MainWindow _Window;

        private static MaddenDBDataSet _MaddenDB = new MaddenDBDataSet();
        private static CharacterTableAdapter _CharacterTableAdapter = new CharacterTableAdapter();
        private static FranchiseTableAdapter _FranchiseTableAdapter = new FranchiseTableAdapter();
        private static GamePlayerTableAdapter _GamePlayerTableAdatper = new GamePlayerTableAdapter();
        private static GameTableAdapter _GameTableAdapter = new GameTableAdapter();
        private static PersonTableAdapter _PersonTableAdapter = new PersonTableAdapter();
        private static SeasonTableAdapter _SeasonTableAdapter = new SeasonTableAdapter();
        private static UniverseTableAdapter _UniverseTableAdapter = new UniverseTableAdapter();
        private static UserYearTableAdapter _UserYearTableAdapter = new UserYearTableAdapter();
        private static CollegeTableAdapter _CollegeTableAdapter = new CollegeTableAdapter();
        private static view_PlayersTableAdapter _PlayerView = new view_PlayersTableAdapter();
        private static view_UniverseCharactersTableAdapter _UniverseCharacterView = new view_UniverseCharactersTableAdapter();
        private static UniverseCharacterTableAdapter _UniverseCharacterTableAdapter = new UniverseCharacterTableAdapter();
        private static view_ScheduleTableAdapter _ScheduleView = new view_ScheduleTableAdapter();
        private static view_YearsTableAdapter _YearView = new view_YearsTableAdapter();
        private static View_GameStatsTableAdapter _GameStatsView = new View_GameStatsTableAdapter();
        private static view_RegularSeasonTableAdapter _SeasonView = new view_RegularSeasonTableAdapter();
        private static view_PlayoffsTableAdapter _PlayoffsView = new view_PlayoffsTableAdapter();

        //Keep a tab of all of our ViewModels

        private static DataRowView _SelectedUniverse = null;
        public static DataRowView SelectedUniverse { get { return _SelectedUniverse; } set { _SelectedUniverse = value; } }

        #region Methods

        //Navigation
        public static void Switch(UserControl newPage)
        {
            _Window.Navigate(newPage);
        }

        public static void Switch(UserControl newPage, object state)
        {
            _Window.Navigate(newPage, state);
        }

        #endregion  

    }

Будем весьма благодарны за любые указатели на хранение глобальных переменных!

1 Ответ

0 голосов
/ 28 апреля 2018

Это то, что я сделал с помощью MvvmCross, с примером для хранения выбранного языка (необходим глобальный var). Я также использую тот же шаблон для версий и т. Д. Вот часть моего класса SettingsPreferences:

public static string SelectedLanguage
{
    get { return Settings.AppSettings.GetValueOrDefault(StringConstants.SelectedLanguage, SelectedLanguageDefault); }

    set { Settings.AppSettings.AddOrUpdateValue(StringConstants.SelectedLanguage, value); }
}

public static bool FirstRun
    {
        get { return Settings.AppSettings.GetValueOrDefault(StringConstants.FirstRun, FirstRunDefault); }

        set { Settings.AppSettings.AddOrUpdateValue(StringConstants.FirstRun, value); }
    }

    public static int LatestUpdateVersion
    {
        get { return Settings.AppSettings.GetValueOrDefault(StringConstants.LatestUpdateVersion, LatestUpdateVersionDefault); }

        set { Settings.AppSettings.AddOrUpdateValue(StringConstants.LatestUpdateVersion, value); }
    }

    public static string LatestUpdateVersionDate
    {
        get { return Settings.AppSettings.GetValueOrDefault(StringConstants.LatestUpdateVersionDate, LatestUpdateVersionDateDefault); }

        set { Settings.AppSettings.AddOrUpdateValue(StringConstants.LatestUpdateVersionDate, value); }
    }

Настройки - это оболочка к пакету nuget для сохраняющихся вещей (поддерживает проекты Android, iOS, Windows Store (Windows Phone 8.1 и Windows Store 8.1) и WPF):

public static class Settings
{
    public static ISettings AppSettings
    {
        get
        {
            return CrossSettings.Current;
        }
    }
}

Теперь моя LanguageViewModel называет это просто так:

var lang = SettingsPreferences.SelectedLanguage;

Чтобы обновить настройку, просто:

SettingsPreferences.SelectedLanguage = "en";

Это может быть что угодно на самом деле.

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